在Java后端开发中,权限管理是不可或缺的一部分。Shiro是一个强大的Java安全框架,它可以帮助我们轻松实现身份验证、授权、会话管理等安全功能。而Spring Boot则是一个简洁、快速开发应用程序的框架。将Shiro与Spring Boot集成,可以使我们的应用程序在保持简洁的同时,实现强大的安全功能。本文将带你一步步轻松学会Shiro与Spring Boot的完美集成,告别繁琐配置!
一、环境搭建
在开始集成之前,我们需要搭建好开发环境。以下是一个基本的开发环境搭建步骤:
- 安装Java开发工具包(JDK):建议使用1.8及以上版本。
- 安装IDE:推荐使用IntelliJ IDEA或Eclipse。
- 安装Maven:Maven是项目构建和依赖管理的工具。
- 创建Spring Boot项目:使用Spring Initializr创建一个基础的Spring Boot项目。
二、添加Shiro依赖
在Spring Boot项目中,我们需要添加Shiro的依赖。打开项目的pom.xml文件,添加以下依赖:
<dependencies>
<!-- Shiro核心依赖 -->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.10.0</version>
</dependency>
<!-- Shiro Spring集成依赖 -->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.10.0</version>
</dependency>
<!-- Spring Boot Web依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
三、配置Shiro
在Spring Boot项目中,配置Shiro相对简单。我们只需要在application.properties或application.yml文件中添加以下配置:
# Shiro配置
shiro.cacheManager=org.apache.shiro.cache.ehcache.EhCacheManager
shiro.cacheManager.cacheName=shiroCache
shiro.sessionManager.sessionValidationInterval=1800
shiro.sessionManager.sessionTimeout=1800
shiro.sessionManager.sessionValidationSchedulerEnabled=true
shiro.sessionManager.sessionIdCookieEnabled=true
shiro.sessionManager.sessionIdCookie.name=sessionId
shiro.sessionManager.sessionIdCookie.httpOnly=true
shiro.sessionManager.sessionIdCookie.maxAge=-1
四、实现Shiro配置类
创建一个Shiro配置类,用于配置Shiro相关组件。例如,创建一个名为ShiroConfig的类:
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.session.mgt.SessionManager;
import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.handler.SimpleUrlHandlerMapping;
@Configuration
public class ShiroConfig {
@Bean
public SecurityManager securityManager() {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
// 添加自定义的Realm
securityManager.setRealm(customRealm());
return securityManager;
}
@Bean
public CustomRealm customRealm() {
return new CustomRealm();
}
@Bean
public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean();
shiroFilter.setSecurityManager(securityManager);
// 添加过滤器规则
shiroFilter.setFilterChainDefinitionMap(filterChainDefinitionMap());
// 添加登录和未授权页面
shiroFilter.setLoginUrl("/login");
shiroFilter.setUnauthorizedUrl("/unauthorized");
return shiroFilter;
}
@Bean
public SimpleUrlHandlerMapping urlHandlerMapping() {
SimpleUrlHandlerMapping handlerMapping = new SimpleUrlHandlerMapping();
// 添加静态资源处理器
handlerMapping.addHandler("/static/**", new StaticResourceUrlHandler());
return handlerMapping;
}
@Bean
public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {
AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor();
advisor.setSecurityManager(securityManager);
return advisor;
}
private Map<String, String> filterChainDefinitionMap() {
Map<String, String> filterChainDefinitionMap = new HashMap<>();
// 配置过滤规则
filterChainDefinitionMap.put("/login", "anon");
filterChainDefinitionMap.put("/logout", "anon");
filterChainDefinitionMap.put("/unauthorized", "anon");
filterChainDefinitionMap.put("/static/**", "anon");
filterChainDefinitionMap.put("/**", "authc");
return filterChainDefinitionMap;
}
}
五、实现自定义Realm
在Shiro中,Realm负责处理认证和授权。我们需要实现一个自定义的Realm,用于处理用户的认证和授权信息。以下是一个简单的自定义Realm示例:
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.Realm;
public class CustomRealm extends Realm {
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
// 根据用户名查询用户信息
String username = (String) token.getPrincipal();
// 获取用户密码
String password = (String) token.getCredentials();
// 根据用户名和密码判断是否认证成功
if ("admin".equals(username) && "admin".equals(password)) {
return new SimpleAuthenticationInfo(username, password, getName());
}
return null;
}
@Override
protected AuthorizationInfo doGetAuthorizationInfo(AuthenticationToken token) {
// 根据用户名获取用户角色信息
String username = (String) token.getPrincipal();
if ("admin".equals(username)) {
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
info.addRole("admin");
return info;
}
return null;
}
}
六、总结
通过以上步骤,我们成功将Shiro与Spring Boot集成,并实现了一个简单的用户认证和授权功能。在实际项目中,我们可以根据需求修改和扩展Shiro配置、自定义Realm等。希望本文能帮助你轻松学会Shiro与Spring Boot的集成,告别繁琐配置!