Springboot与Shiro权限控制深度集成及Thymeleaf按钮级权限示例
需积分: 10 61 浏览量
更新于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 上传
2019-03-10 上传
2018-09-03 上传
2018-06-03 上传
2020-06-15 上传
2020-02-04 上传
2019-11-26 上传
2019-03-08 上传
109 浏览量
yunfei1992
- 粉丝: 222
- 资源: 4
最新资源
- 探索数据转换实验平台在设备装置中的应用
- 使用git-log-to-tikz.py将Git日志转换为TIKZ图形
- 小栗子源码2.9.3版本发布
- 使用Tinder-Hack-Client实现Tinder API交互
- Android Studio新模板:个性化Material Design导航抽屉
- React API分页模块:数据获取与页面管理
- C语言实现顺序表的动态分配方法
- 光催化分解水产氢固溶体催化剂制备技术揭秘
- VS2013环境下tinyxml库的32位与64位编译指南
- 网易云歌词情感分析系统实现与架构
- React应用展示GitHub用户详细信息及项目分析
- LayUI2.1.6帮助文档API功能详解
- 全栈开发实现的chatgpt应用可打包小程序/H5/App
- C++实现顺序表的动态内存分配技术
- Java制作水果格斗游戏:策略与随机性的结合
- 基于若依框架的后台管理系统开发实例解析