活动介绍
file-type

深入Shiro权限框架:自定义Realm实现指南

RAR文件

2星 | 下载需积分: 32 | 1.21MB | 更新于2025-04-03 | 172 浏览量 | 30 下载量 举报 收藏
download 立即下载
Apache Shiro 是一个功能强大的Java安全框架,它提供了认证、授权、加密和会话管理功能。在这个框架中,Realm 是用来获取安全数据(比如用户、角色和权限)的组件,它扮演了Shiro与应用安全数据间的“桥梁”角色。在实际应用中,有时候默认的Realm并不能满足所有需求,因此需要自定义Realm来适应特定的应用场景。本文档将详细说明如何在Shiro中自定义Realm,并通过一个示例来展示其具体实现。 ### Shiro中自定义Realm的必要性 在Shiro中,默认提供了多种Realm实现,比如IniRealm、JdbcRealm、ActiveDirectoryRealm等。这些内置的Realm能够覆盖很多常规应用的需求,但并不是所有的。比如,当需要从特定的外部系统或自定义数据源进行用户验证和授权时,就需要自定义Realm。例如,如果你的应用存储用户信息在自定义的数据库中、使用专门的用户服务接口或者有特殊的授权逻辑,那么自定义Realm就显得十分必要。 ### 自定义Realm的关键知识点 自定义Realm需要实现Shiro的`Realm`接口或继承一个现有的`Realm`类(如`AuthorizingRealm`、`AuthenticatingRealm`)。要自定义一个Realm,主要步骤包括: 1. **扩展Realm接口**: - 实现`Realm`接口,这个接口要求实现获取身份验证信息和授权信息的方法。 - 通常为了简化,可以继承`AuthorizingRealm`类,该类实现了`Realm`接口中的大部分功能,只须重写相关方法即可。 2. **身份验证方法**: - 实现`doGetAuthenticationInfo(AuthenticationToken token)`方法,该方法用于身份验证过程中的账号密码校验。 - 实例化`AuthenticationInfo`对象,并进行身份信息匹配。 3. **授权方法**: - 实现`doGetAuthorizationInfo(PrincipalCollection principals)`方法,该方法用于授权过程中角色、权限的加载。 - 实例化`AuthorizationInfo`对象,并根据用户身份信息,加载相应的角色(`SimpleRole`)和权限(`SimplePermission`)。 4. **配置Realm到Shiro安全框架**: - 通过Shiro的`SecurityManager`配置自定义Realm。 - 在Shiro的配置文件或配置类中添加自定义Realm的实例。 ### 实际示例分析 假设现在有一个名为`ShiroRealmProject`的项目,该项目使用Shiro框架,并且需要从自定义的数据源来获取用户信息进行安全控制。以下是自定义Realm的一个简单示例: ```java import org.apache.shiro.authc.*; import org.apache.shiro.authz.AuthorizationInfo; import org.apache.shiro.realm.AuthorizingRealm; import org.apache.shiro.subject.PrincipalCollection; import org.apache.shiro.authc.credential.CredentialsMatcher; import org.apache.shiro.authc.credential.HashedCredentialsMatcher; public class CustomRealm extends AuthorizingRealm { // 设置凭证匹配器 { CredentialsMatcher matcher = new HashedCredentialsMatcher(); matcher.setHashAlgorithmName("SHA-256"); matcher.setHashIterations(1); setCredentialsMatcher(matcher); } // 身份认证方法 @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { UsernamePasswordToken upToken = (UsernamePasswordToken) token; String username = upToken.getUsername(); String password = // 从自定义数据源获取密码,比如自定义的数据库接口或服务 SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(username, password, getName()); return info; } // 授权方法 @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { // 获取用户身份 Object principal = principals.getPrimaryPrincipal(); // 根据身份获取角色和权限 String role = // 从自定义数据源获取角色 String permission = // 从自定义数据源获取权限 SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); info.addRole(role); info.addStringPermission(permission); return info; } } ``` 在上述代码中,`CustomRealm`类通过继承`AuthorizingRealm`并实现两个主要方法,`doGetAuthenticationInfo`和`doGetAuthorizationInfo`,来完成身份验证和授权逻辑。其中,密码的匹配过程使用了`CredentialsMatcher`,这里指定使用了SHA-256算法,并设置了一次迭代。在`doGetAuthenticationInfo`方法中,实际应该从数据源获取密码进行比对;在`doGetAuthorizationInfo`方法中,从数据源获取用户角色和权限。 在实际配置Shiro安全框架时,需要将这个自定义的`CustomRealm`配置到`SecurityManager`中: ```java import org.apache.shiro.mgt.SecurityManager; import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor; import org.apache.shiro.spring.web.ShiroFilterFactoryBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class ShiroConfiguration { @Bean public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) { ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); shiroFilterFactoryBean.setSecurityManager(securityManager); // 其他配置... return shiroFilterFactoryBean; } @Bean public SecurityManager securityManager() { DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); // 设置realm securityManager.setRealm(customRealm()); return securityManager; } @Bean public CustomRealm customRealm() { return new CustomRealm(); } // 配置Shiro注解支持 @Bean public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) { AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor(); advisor.setSecurityManager(securityManager); return advisor; } } ``` 通过上述配置,自定义的`CustomRealm`被添加到`SecurityManager`中,并且通过`ShiroFilterFactoryBean`配置Shiro的过滤器链。Shiro的安全控制逻辑将使用`CustomRealm`中的方法来完成认证和授权。 ### 结语 Shiro是一个灵活的安全框架,通过自定义Realm可以很轻松地根据自己的需求进行扩展,以适应复杂的安全管理场景。通过本文的介绍,我们了解了自定义Realm的意义、步骤以及一个简单的示例。掌握了这些知识后,开发人员可以更加自信地使用Shiro框架来构建安全的应用程序。

相关推荐

源代码CXH
  • 粉丝: 124
上传资源 快速赚钱