由于权限管理模块一般都是在资源一层,如果更深一层的话,则可能会与业务代码进行耦合,故提倡Shiro做权限管理,Spring官网也是用Shiro进行的权限管理。
SUB 主体
Authenticator 认证器(登陆)
Authorizer 授权器(访问权限)
SessionManager Shiro自己的Session不依赖于Web
SessionDAO Session操作增删改查
CacheManager 缓存操作(缓存角色和权限)
Reaims Shiro和数据库直接的一个桥梁
AuthenticationTest.java
package com.cheng.test; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.UsernamePasswordToken; import org.apache.shiro.mgt.DefaultSecurityManager; import org.apache.shiro.realm.SimpleAccountRealm; import org.apache.shiro.subject.Subject; import org.junit.Before; import org.junit.Test; public class AuthenticationTest { SimpleAccountRealm simpleAccountRealm = new SimpleAccountRealm(); @Before public void addUser() { simpleAccountRealm.addAccount("cheng", "123", "admin", "user"); } @Test public void testAuthentication() { // 1. 构建 SecurityManager 环境 DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager(); defaultSecurityManager.setRealm(simpleAccountRealm); // 2. 主体提交认证请求 SecurityUtils.setSecurityManager(defaultSecurityManager); Subject subject = SecurityUtils.getSubject(); UsernamePasswordToken token = new UsernamePasswordToken("cheng", "123"); subject.login(token); System.out.println("isAuthenticated: " + subject.isAuthenticated()); // 检查用户是否有 admin 角色 subject.checkRoles("admin", "user"); // 退出认证 subject.logout(); System.out.println("isAuthenticated: " + subject.isAuthenticated()); } }
IniRealm
Shiro的IniRealm 形式:此形式主要是将数据存放到相应的user.ini即文件系统中,通过给定的格式,从文件中查找相应的数据是否存在。
步骤:
删除之前SimpleAccountRealm,在实体中创建IniRealm并实例化。在构造方法中传入相应的user.ini地址。此文件地址一般写为:classpath:user.ini的形式。需要在相应的包中建立resource文件夹,并且放入user.ini文件。
user.ini文件的定义格式为:[users] 用户名=密码,角色 [roles] 角色=权限名(例子:amdin=user:delete,user:update)
与之前认证与授权步骤一样,直接将IniRealm放入到SecurityManager中,进行登录认证,之后进行checkRoles验证与checkPersimmon验证权限等操作即可。
Ps:中括号表示:要同时具备里面的角色才行,是 && 的关系。