Springboot与Shiro权限控制深度集成及Thymeleaf按钮级权限示例

需积分: 10 5 下载量 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中的权限标签使用。这是一套完整的权限管理方案,确保了应用的安全性和灵活性。