Shiro自定义Realms 墨蓝 2022-07-15 00:59 308阅读 0赞 Shiro 的三个核心组件:Subject, SecurityManager 和 Realms. 来回顾一下这三个组件的关系 ![Shiro 的三个核心组件][Shiro] # Subject # Subject:即“当前操作用户”。但是,在 Shiro 中,Subject 这一概念并不仅仅指人,也可以是第三方进程、后台帐户(Daemon Account)或其他类似事物。它仅仅意味着“当前跟软件交互的东西”。但考虑到大多数目的和用途,你可以把它认为是 Shiro的“用户”概念。 Subject代表了当前用户的安全操作,SecurityManager则管理所有用户的安全操作。 # SecurityManager # SecurityManager:它是 Shiro 框架的核心,典型的 Facade 模式,Shiro 通过SecurityManager 来管理内部组件实例,并通过它来提供安全管理的各种服务。 # Realm # Realm: Realm 充当了 Shiro 与应用安全数据间的“桥梁”或者“连接器”。也就是说,当对用户执行认证(登录)和授权(访问控制)验证时,Shiro 会从应用配置的 Realm中查找用户及其权限信息。 从这个意义上讲,Realm 实质上是一个安全相关的 DAO:它封装了数据源的连接细 节,并在需要时将相关数据提供给 Shiro。 当配置 Shiro 时,你必须至少指定一个Realm,用于认证和(或)授权。配置多个 Realm 是可以的,但是至少需要一个。Shiro 内置了可以连接大量安全数据源(又名目录)的 Realm,如 LDAP、关系数据库(JDBC)、类似 INI 的文本配置资源以及属性文件等。如果缺省的 Realm 不能满足需求,你还可以插入代表自定义数据源的自己的 Realm 实现。 今天主要介绍一下如何自定义Realms # 自定义Realms # 继承org.apache.shiro.realm.AuthorizingRealm 重写doGetAuthenticationInfo和doGetAuthorizationInfo方法 doGetAuthenticationInfo方法是获取认证信息,也就是用户登录 doGetAuthorizationInfo方法是获取授权信息,也就查找用户的角色和权限,看是否有权操作 具体代码如下 package com.learn.shiro; import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.AuthenticationInfo; import org.apache.shiro.authc.AuthenticationToken; import org.apache.shiro.authc.SimpleAuthenticationInfo; import org.apache.shiro.authc.UsernamePasswordToken; import org.apache.shiro.authz.AuthorizationInfo; import org.apache.shiro.authz.SimpleAuthorizationInfo; import org.apache.shiro.realm.AuthorizingRealm; import org.apache.shiro.subject.PrincipalCollection; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import com.test.entity.User; public class MyShiroRealm extends AuthorizingRealm { private final Logger logger = LoggerFactory.getLogger(this.getClass()); @Autowired private UserAuthService userAuthService; /*** * 获取授权信息,也就是看有没有权限操作 */ @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { logger.info("-----授权-----"); User user = (User) principals.getPrimaryPrincipal(); SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo(); authorizationInfo.setRoles(userAuthService.findRoles(user)); authorizationInfo.setStringPermissions(userAuthService.findPermissions(user)); return authorizationInfo; } /*** * 获取认证信息,也就是用户登录 */ @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authcToken) throws AuthenticationException { logger.info("-----认证-----"); // 将AuthenticationToken转化为UsernamePasswordToken UsernamePasswordToken token = (UsernamePasswordToken) authcToken; // 从token中得到用户名和密码 String username = token.getUsername().trim(); String password = ""; if (token.getPassword() != null) { password = new String(token.getPassword()); } logger.info("-----username:{},password:{}-----", username, password); User user = userAuthService.login(username, password); if (user != null) { SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user, password.toCharArray(), getName()); return info; } return null; } } 调用的UserService package com.learn.shiro; import java.util.Set; import com.test.entity.User; public interface UserAuthService { /** * 登录 * * @param username * @param password * @return */ public User login(String username, String password); /** * 根据用户id查找其角色 * * @param user * @return */ public Set<String> findRoles(User user); /** * 根据用户id查找其权限 * * @param user * @return */ public Set<String> findPermissions(User user); } Service就去调用自己写的dao了 package com.test.shiro; import java.util.Set; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.test.dao.UserDao; import com.test.entity.User; @Service public class UserAuthServiceImpl implements UserAuthService { @Autowired UserDao userDao; /** * 验证登录 * * @param username * @param password * @return */ public User login(String username, String password) { return userDao.login(username, password); } public Set<String> findRoles(User user) { /* * Set<String> roles = new HashSet<>(); roles.add("user"); */ return null; // return loginUserDao.findRoles(userid); } public Set<String> findPermissions(User user) { return userDao.findPermissions(user); } } 最后在spring配置文件里配置自定义的shiroRealm <bean id="myShiroRealm" class="com.test.shiro.MyShiroRealm"></bean> <!-- Shiro安全管理器 --> <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <property name="realm" ref="myShiroRealm"></property> <property name="cacheManager" ref="shiroCacheManager"></property> </bean> [Shiro]: /images/20220715/25605736bc6144878c56aaa904dafc50.png
还没有评论,来说两句吧...