Springboot与Shiro权限控制深度集成及Thymeleaf按钮级权限示例
需积分: 10 186 浏览量
更新于2024-09-08
收藏 132KB DOCX 举报
在Spring Boot项目中整合Apache Shiro权限控制是一项常见的需求,尤其是在企业级应用中,安全性是必不可少的部分。本文将详细介绍如何使用Springboot与Shiro实现权限管理,并结合Thymeleaf模板引擎进行按钮级别的细致权限控制。
首先,要集成Shiro到Spring Boot项目,你需要在项目的pom.xml文件中添加Shiro的Spring模块依赖。在给定的代码片段中,已经指定了一个版本为1.4.0的`shiro-spring`依赖:
```xml
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.4.0</version>
</dependency>
```
接下来,配置Shiro的核心组件。Shiro的核心在于实现`Realm`接口,`DemoShiroRealm`类就是一个自定义的Realm,用于处理用户的认证(Authentication)和授权(Authorization)过程。在这个类中,你需要:
1. 导入必要的服务接口,如`SysUserService`,用于从数据库获取用户信息。
2. 实现`doGetAuthenticationInfo`方法,当用户尝试登录时,会调用此方法来验证用户名和密码,如果验证成功,返回一个`AuthenticationInfo`对象。
3. 实现`doGetAuthorizationInfo`方法,用于获取用户的权限信息,根据用户的标识(PrincipalCollection),返回一个`AuthorizationInfo`对象。
例如,`DemoShiroRealm`可能如下所示:
```java
@Autowired
private SysUserService sysUserService;
public AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
// 解析token并获取用户信息
String username = (String) token.getPrincipal();
SysUser user = sysUserService.getUserByUsername(username);
// 验证用户是否存在及密码正确
if (user == null || !passwordService.matches(user.getPassword(), token.getCredentials())) {
throw new AccountException("Invalid username or password");
}
// 创建SimpleAuthenticationInfo对象
SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(
user, // 用户名
user.getPassword(), // 密码
ByteSource.Util.bytes(username), // 用户标识
getName() // Realm名称
);
return authenticationInfo;
}
public AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
// 获取用户标识
String username = (String) principals.fromRealm(getName()).iterator().next();
// 从数据库查询用户权限
Set<String> permissions = sysUserService.getPermissionsByUser(username);
SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
for (String permission : permissions) {
authorizationInfo.addStringPermission(permission);
}
return authorizationInfo;
}
```
在Spring Boot配置中,你需要配置Shiro的SecurityManager、Web过滤器和全局拦截器。此外,为了在Thymeleaf模板中使用Shiro标签,还需要引入Thymeleaf的Shiro扩展。这通常在Spring Boot的WebMvc配置中完成:
```java
@Bean
public ShiroFilterFactoryBean shiroFilterFactoryBean() {
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
shiroFilterFactoryBean.setSecurityManager(securityManager());
shiroFilterFactoryBean.setLoginUrl("/login");
shiroFilterFactoryBean.setSuccessUrl("/index");
// 自定义Thymeleaf标签
shiroFilterFactoryBean.setThymeleafViewNames("*.html");
shiroFilterFactoryBean.setCaching(false); // 去除缓存,确保每次请求权限检查都是最新的
Map<String, String> filterChainDefinitionMap = new HashMap<>();
filterChainDefinitionMap.put("/login", "authc");
// 其他URL定义权限规则,如:/admin/ - 如果用户有权限访问admin区域
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
return shiroFilterFactoryBean;
}
```
最后,为了在Thymeleaf模板中实现按钮级别的权限控制,你需要使用Shiro提供的`hasPermission`或`hasAllPermissions`标签,比如:
```html
<button th:if="${#shiro.hasPermission('ADMIN')}">管理员操作</button>
```
这将检查当前用户是否具有"ADMIN"权限,只有拥有该权限的用户才能看到这个按钮。通过这种方式,你可以轻松地在页面上实现基于角色或权限的动态按钮隐藏或显示。
总结来说,Spring Boot与Shiro的整合涉及依赖引入、自定义Realm实现、Spring Boot配置以及Thymeleaf中的权限标签使用。这是一套完整的权限管理方案,确保了应用的安全性和灵活性。
2014-04-09 上传
2020-08-25 上传
2018-06-03 上传
2020-06-15 上传
2020-02-04 上传
2019-03-08 上传
2018-11-27 上传
yunfei1992
- 粉丝: 223
- 资源: 4
最新资源
- Consistent-Sparse-Deep-Learning-Theory-and-Computation
- torch_spline_conv-1.2.1-cp37-cp37m-linux_x86_64whl.zip
- MySQL用户定义函数
- Release QMYSQL driver 6.2.4-msvc2019-x64
- resourcer-docs:简单的应用程序,可为使用koa-resourcer挂载的路由生成文档
- daliansky-tan.github.io
- 医疗健康网站模版
- ANNOgesic-1.0.18-py3-none-any.whl.zip
- primeiro
- 用心倾听患者就是最好的良药——医疗行业项目汇报ppt模板
- D-StarBeacon
- 图片
- recent-projects:原子
- hacker-chat
- polyEngine:是的,制作游戏
- SQLite比较实用程序