介绍
Spring Boot是一款快速开发Java应用的框架,而Shiro是一个强大且易用的Java安全框架。本文将介绍如何在Spring Boot项目中整合使用Shiro进行权限管理。
环境准备
- JDK 1.8+
- Maven 3.6.2+
- Spring Boot 2.5.4
- Shiro 1.7.1
步骤
第一步:创建Spring Boot项目
使用Spring Initializr创建一个新的Spring Boot项目。在pom.xml文件中添加Shiro和相关依赖。
<dependencies>
<!-- Spring Boot Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Shiro -->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring-boot-web-starter</artifactId>
<version>1.7.1</version>
</dependency>
</dependencies>
第二步:配置Shiro
在application.properties文件中添加Shiro的相关配置,如下所示:
# Shiro
# 配置Shiro的加密方式
shiro.credentialsMatcher.hashAlgorithmName=SHA-256
shiro.credentialsMatcher.hashIterations=1000
# 配置Shiro的登录url
shiro.user.loginUrl=/login
# 配置Shiro的权限url
shiro.user.unauthorizedUrl=/403
第三步:定义权限和角色
在数据库中创建用户、角色和权限表,并插入测试数据。定义角色和权限的关联关系,并为用户分配角色和权限。
第四步:实现认证和授权
创建一个自定义的Realm类,继承Shiro的AuthorizingRealm
类,并重写认证和授权的方法。
public class CustomRealm extends AuthorizingRealm {
@Autowired
private UserService userService;
@Autowired
private RoleService roleService;
@Autowired
private PermissionService permissionService;
// 认证
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
// 获取用户名和密码
UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;
String username = token.getUsername();
String password = String.valueOf(token.getPassword());
// 根据用户名查询用户信息
User user = userService.findByUsername(username);
if (user == null) {
throw new UnknownAccountException();
}
// 验证密码
if (!password.equals(user.getPassword())) {
throw new IncorrectCredentialsException();
}
// 返回认证信息
return new SimpleAuthenticationInfo(user, password, getName());
}
// 授权
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
// 获取当前认证的用户信息
User user = (User) principalCollection.getPrimaryPrincipal();
// 创建授权信息对象
SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
// 查询用户角色并授权
List<Role> roles = roleService.findByUserId(user.getId());
for (Role role : roles) {
authorizationInfo.addRole(role.getName());
// 查询角色权限并授权
List<Permission> permissions = permissionService.findByRoleId(role.getId());
for (Permission permission : permissions) {
authorizationInfo.addStringPermission(permission.getPermission());
}
}
return authorizationInfo;
}
}
第五步:配置Shiro的过滤器
在Spring Boot配置类中配置Shiro的过滤器。
@Configuration
public class ShiroConfig {
@Bean
public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {
ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean();
shiroFilter.setSecurityManager(securityManager);
// 登录URL
shiroFilter.setLoginUrl("/login");
// 没有权限的URL
shiroFilter.setUnauthorizedUrl("/403");
// 配置URL过滤规则
Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
// 登录URL放行
filterChainDefinitionMap.put("/login", "anon");
// 静态资源放行
filterChainDefinitionMap.put("/static/**", "anon");
// 除了登录和静态资源,其他URL都需要认证和授权
filterChainDefinitionMap.put("/**", "authc");
shiroFilter.setFilterChainDefinitionMap(filterChainDefinitionMap);
return shiroFilter;
}
@Bean
public SecurityManager securityManager(CustomRealm realm) {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
securityManager.setRealm(realm);
return securityManager;
}
@Bean
public CustomRealm realm() {
return new CustomRealm();
}
@Bean
public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {
AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor();
advisor.setSecurityManager(securityManager);
return advisor;
}
}
测试
启动Spring Boot项目,并在浏览器中访问相应的URL进行测试。
结论
通过整合使用Shiro实现Spring Boot项目的权限管理,可以更好地保护应用程序的安全性和数据的完整性。此外,Shiro还提供了丰富的身份认证和权限控制的机制,可以灵活地满足不同应用程序的需求。
本文来自极简博客,作者:幽灵船长酱,转载请注明原文链接:SpringBoot中关于Shiro权限管理的整合使用