深入Shiro权限框架:自定义Realm实现指南
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
最新资源
- Julia语言优化问题库OptimizationProblems.jl
- PyNLPl库:Python自然语言处理的全面工具集
- Tiny-dnn:C++14深度学习框架,无需外部依赖
- iOS端Keras模型转Core ML实现韩文手写识别
- Neutralino.js官网源码解析与贡献指南
- Nim语言实现的无服务器框架插件示例应用
- GitHub API的Ecto适配器github_ecto功能介绍
- Python自动化脚本:使用Selenium快速创建Gmail账号
- 使用Vue.js和CodeSandbox打造GitHub仓库信息平台
- VHDL官方标准文档:语法指南与参考
- OCaml开发:Coq团队打造的机器人是如何运作的
- JKSV:Nintendo Switch交换机数据管理工具介绍
- ChiliPhotoPicker:Android端照片选择器库的介绍与应用
- Python与Google Colab:表格和Drive数据处理教程
- 探索自适应神经符号网络代理:Nim-ansna的深度解析
- StatFiles.jl:Julia中的Stata、SPSS和SAS文件集成解决方案
- 探索Lapis:Lua与OpenResty的高效Web框架
- 掌握Android开发技巧:awesome-android-tips精选清单
- ResourceDoc:iOS开发者的资源共享与快速接入指南
- 深度学习在机器学习领域研究论文摘要解析
- 利用luastatic创建Lua独立可执行程序
- Lua语言服务器:由Lua编写的编程语言支持工具
- 在Nintendo Switch上通过sdl实现hello world展示
- Caffe2框架:轻量级、模块化与深度学习的扩展性

