Shiro自定义Realms

墨蓝 2022-07-15 00:59 484阅读 0赞

Shiro 的三个核心组件:Subject, SecurityManager 和 Realms.

来回顾一下这三个组件的关系

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方法是获取授权信息,也就查找用户的角色和权限,看是否有权操作

具体代码如下

  1. package com.learn.shiro;
  2. import org.apache.shiro.authc.AuthenticationException;
  3. import org.apache.shiro.authc.AuthenticationInfo;
  4. import org.apache.shiro.authc.AuthenticationToken;
  5. import org.apache.shiro.authc.SimpleAuthenticationInfo;
  6. import org.apache.shiro.authc.UsernamePasswordToken;
  7. import org.apache.shiro.authz.AuthorizationInfo;
  8. import org.apache.shiro.authz.SimpleAuthorizationInfo;
  9. import org.apache.shiro.realm.AuthorizingRealm;
  10. import org.apache.shiro.subject.PrincipalCollection;
  11. import org.slf4j.Logger;
  12. import org.slf4j.LoggerFactory;
  13. import org.springframework.beans.factory.annotation.Autowired;
  14. import com.test.entity.User;
  15. public class MyShiroRealm extends AuthorizingRealm {
  16. private final Logger logger = LoggerFactory.getLogger(this.getClass());
  17. @Autowired
  18. private UserAuthService userAuthService;
  19. /*** * 获取授权信息,也就是看有没有权限操作 */
  20. @Override
  21. protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
  22. logger.info("-----授权-----");
  23. User user = (User) principals.getPrimaryPrincipal();
  24. SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
  25. authorizationInfo.setRoles(userAuthService.findRoles(user));
  26. authorizationInfo.setStringPermissions(userAuthService.findPermissions(user));
  27. return authorizationInfo;
  28. }
  29. /*** * 获取认证信息,也就是用户登录 */
  30. @Override
  31. protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authcToken)
  32. throws AuthenticationException {
  33. logger.info("-----认证-----");
  34. // 将AuthenticationToken转化为UsernamePasswordToken
  35. UsernamePasswordToken token = (UsernamePasswordToken) authcToken;
  36. // 从token中得到用户名和密码
  37. String username = token.getUsername().trim();
  38. String password = "";
  39. if (token.getPassword() != null) {
  40. password = new String(token.getPassword());
  41. }
  42. logger.info("-----username:{},password:{}-----", username, password);
  43. User user = userAuthService.login(username, password);
  44. if (user != null) {
  45. SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user, password.toCharArray(), getName());
  46. return info;
  47. }
  48. return null;
  49. }
  50. }

调用的UserService

  1. package com.learn.shiro;
  2. import java.util.Set;
  3. import com.test.entity.User;
  4. public interface UserAuthService {
  5. /** * 登录 * * @param username * @param password * @return */
  6. public User login(String username, String password);
  7. /** * 根据用户id查找其角色 * * @param user * @return */
  8. public Set<String> findRoles(User user);
  9. /** * 根据用户id查找其权限 * * @param user * @return */
  10. public Set<String> findPermissions(User user);
  11. }

Service就去调用自己写的dao了

  1. package com.test.shiro;
  2. import java.util.Set;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.stereotype.Service;
  5. import com.test.dao.UserDao;
  6. import com.test.entity.User;
  7. @Service
  8. public class UserAuthServiceImpl implements UserAuthService {
  9. @Autowired
  10. UserDao userDao;
  11. /** * 验证登录 * * @param username * @param password * @return */
  12. public User login(String username, String password) {
  13. return userDao.login(username, password);
  14. }
  15. public Set<String> findRoles(User user) {
  16. /* * Set<String> roles = new HashSet<>(); roles.add("user"); */
  17. return null;
  18. // return loginUserDao.findRoles(userid);
  19. }
  20. public Set<String> findPermissions(User user) {
  21. return userDao.findPermissions(user);
  22. }
  23. }

最后在spring配置文件里配置自定义的shiroRealm

  1. <bean id="myShiroRealm" class="com.test.shiro.MyShiroRealm"></bean>
  2. <!-- Shiro安全管理器 -->
  3. <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
  4. <property name="realm" ref="myShiroRealm"></property>
  5. <property name="cacheManager" ref="shiroCacheManager"></property>
  6. </bean>

发表评论

表情:
评论列表 (有 0 条评论,484人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Shiro定义Realms

    Shiro 的三个核心组件:Subject, SecurityManager 和 Realms. 来回顾一下这三个组件的关系 ![Shiro 的三个核心组件][Shiro]