Apache Shiro安全框架(1)

一、什么是Shiro安全框架

    shrio是一个强大而灵活的开源安全框架,它主要处理身份验证,授权,会话管理和加密。

  • 身份验证:有时称为“登录”,即验证用户的身份。

  • 授权:访问控制的过程,即确定“谁”有权访问“什么”。

  • 会话管理:即使在非Web或EJB应用程序中,也可以管理用户特定的会话。

  • 加密:使用加密算法保持数据安全,同时仍然易于使用。

    支持特性:

  • Web支持:Shiro的Web支持API有助于开发者轻松保护Web应用程序。
  • 缓存:缓存是Apache Shiro API的第一层,可确保安全操作保持快速有效。
  • 并发性:Apache Shiro的并发功能支持多线程应用程序。
  • 测试:测试支持可帮助您编写单元测试和集成测试,并确保您的代码将按预期进行保护。
  • “运行方式”(Run As):允许用户采用其他用户的身份(如果允许),有时在管理方案中很有用。
  • “记住我”:在整个会话中记住用户的身份,因此他们仅在必要时登录。

二、编写shiro基本代码

1.引入相关环境

         引入shiro-core和slf4j-api相关jar包,shiro使用slf4j记录日志。

        <dependency>
		    <groupId>org.slf4j</groupId>
		    <artifactId>slf4j-api</artifactId>
		    <version>1.7.25</version>
		</dependency>
        <dependency>
			<groupId>org.apache.shiro</groupId>
			<artifactId>shiro-core</artifactId>
			<version>1.2.2</version>
		</dependency>

2.创建ini文件

src/main/resources/shiro.ini

扫描二维码关注公众号,回复: 9396357 查看本文章
# ini文件配置
# -----------------------------------------------------------------------------
# 用户信息格式
# username[用户名] = password[密码], role1[角色1], role2[角色2], ..., role[角色n]
# -----------------------------------------------------------------------------
[users]
root = 123456, admin
guest = 123456, rolea
user1 = 12345, roleb

# -----------------------------------------------------------------------------
# 定义角色相关权限
# roleName[角色名] = perm1[权限范围], perm2, ..., permN
# *类似与通配符,代表当前范围内的任何操作
# -----------------------------------------------------------------------------
[roles]
admin = *
rolea = book:bug
roleb = book:add,book:delete

3.参考程序

package demo;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.session.Session;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.Factory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
 * [用户、角色、权限都是字符串]
 * 
 * 
 * */
public class Test {
    //创建当前类的日志对象
	private static final transient Logger log=LoggerFactory.getLogger(Test.class);

	public static void main(String[] args) {
        //创建一个factory,指向ini文件,classpath代表src/main/resourse目录
		Factory<SecurityManager> fac=new  IniSecurityManagerFactory("classpath:shiro.ini");
		SecurityManager manager=fac.getInstance();
		SecurityUtils.setSecurityManager(manager);
		
		log.info("环境初始化完成");
		
		Subject currentUser=SecurityUtils.getSubject();
		//System.out.println(currentUser);
		
		Session session=currentUser.getSession();
		session.setAttribute("message", "this is shiro");
		System.out.println(session.getAttribute("message"));
		//当前用户是否已经验证
		System.out.println(currentUser.isAuthenticated());
		
		if(currentUser.isAuthenticated()) {
			System.out.println("已登录");
		}
		else {
			UsernamePasswordToken token =new UsernamePasswordToken("user1", "12345");
			//token.setRememberMe(true);
			try {
				currentUser.login(token);
				System.out.println("登录成功");
			} catch (UnknownAccountException e) {
				System.out.println("用户不存在");
			}catch (IncorrectCredentialsException e) {
				System.out.println("密码错误");
			}
			
		}
		if(currentUser.hasRole("admin")) {
			System.out.println("欢迎管理员");
		}
		if(currentUser.isPermitted("book:bug")) {
			System.out.println("允许购买书籍");
		}
		if(currentUser.isPermitted("book:add")) {
			System.out.println("允许增加书籍");
		}
		if(currentUser.isPermitted("book:delete")) {
			System.out.println("允许删除书籍");
		}
		currentUser.logout();
	}

}
发布了5 篇原创文章 · 获赞 0 · 访问量 2043

猜你喜欢

转载自blog.csdn.net/qq_35557801/article/details/104494360