springboot整合shiro框架
时间: 2023-04-26 15:03:02 浏览: 158
Spring Boot 整合 Shiro 框架是指在 Spring Boot 应用中使用 Apache Shiro 来管理身份验证和授权。主要步骤如下:
1. 引入 Shiro 依赖;
2. 配置 Shiro;
3. 编写自定义 Realm;
4. 安全配置过滤器;
5. 使用 Shiro 标签和注解管理权限。
详细说明可以参考官方文档或者网上教程。
相关问题
springboot整合shiro框架实现session会话超时
在使用 Spring Boot 整合 Shiro 进行开发时,可以通过配置 Shiro 的 session 过期时间来实现会话超时。具体实现步骤如下:
1. 在 Shiro 的配置文件中配置 session 过期时间:
```xml
<bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
<!-- session 过期时间,单位毫秒 -->
<property name="globalSessionTimeout" value="1800000"/>
<!-- 是否开启删除无效的 session 对象 -->
<property name="deleteInvalidSessions" value="true"/>
</bean>
```
2. 在 Spring Boot 的配置类中配置 Shiro 过滤器:
```java
@Configuration
public class ShiroConfig {
@Bean
public ShiroFilterFactoryBean shiroFilterFactoryBean(DefaultWebSecurityManager securityManager) {
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
// 必须设置 SecurityManager
shiroFilterFactoryBean.setSecurityManager(securityManager);
// 配置登录的 url 和登录成功的 url
shiroFilterFactoryBean.setLoginUrl("/login");
shiroFilterFactoryBean.setSuccessUrl("/index");
// 配置未授权跳转页面
shiroFilterFactoryBean.setUnauthorizedUrl("/403");
// 配置访问权限
LinkedHashMap<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
// 过滤链定义,从上向下顺序执行,一般将 /** 放在最为下边
// authc:所有 url 都必须认证通过才可以访问;anon:所有 url 都都可以匿名访问
filterChainDefinitionMap.put("/login", "anon");
filterChainDefinitionMap.put("/logout", "logout");
filterChainDefinitionMap.put("/static/**", "anon");
filterChainDefinitionMap.put("/js/**", "anon");
filterChainDefinitionMap.put("/css/**", "anon");
filterChainDefinitionMap.put("/images/**", "anon");
filterChainDefinitionMap.put("/**", "authc");
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
return shiroFilterFactoryBean;
}
@Bean
public DefaultWebSecurityManager securityManager() {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
securityManager.setRealm(userRealm());
securityManager.setSessionManager(sessionManager());
return securityManager;
}
@Bean
public UserRealm userRealm() {
return new UserRealm();
}
@Bean
public DefaultWebSessionManager sessionManager() {
DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();
// 设置 session 过期时间,单位毫秒
sessionManager.setGlobalSessionTimeout(1800000);
// 删除无效的 session 对象
sessionManager.setDeleteInvalidSessions(true);
return sessionManager;
}
}
```
通过以上配置,可以在 Shiro 中实现 session 会话超时功能。在用户登录后,session 的过期时间会被设置为配置的时间,当用户在该时间内没有操作时,session 会话将被 Shiro 销毁,用户需要重新登录。
讲一讲SpringBoot整合shiro框架实现登录认证的流程及原理
SpringBoot整合shiro框架实现登录认证的流程及原理可以分为以下步骤:
1. 引入shiro和web依赖
在pom.xml中引入shiro和web依赖,如下所示:
```xml
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.7.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
```
2. 配置shiro
在application.properties文件中配置shiro相关属性,如下所示:
```properties
# shiro配置
# 加密算法
shiro.hashAlgorithmName=md5
# 加密次数
shiro.hashIterations=2
# shiro缓存
shiro.cacheManager=org.apache.shiro.cache.MemoryConstrainedCacheManager
```
3. 自定义Realm
实现自定义Realm,继承org.apache.shiro.realm.AuthorizingRealm类,重写doGetAuthorizationInfo和doGetAuthenticationInfo方法,分别用于授权和认证。
```java
public class CustomRealm extends AuthorizingRealm {
@Autowired
private UserService userService;
/**
* 授权
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
return null;
}
/**
* 认证
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) token;
String username = usernamePasswordToken.getUsername();
User user = userService.findByUsername(username);
if (user == null) {
throw new UnknownAccountException("用户名不存在");
}
String password = new String(usernamePasswordToken.getPassword());
String salt = user.getSalt();
String hashedPassword = new SimpleHash("md5", password, salt, 2).toString();
if (!user.getPassword().equals(hashedPassword)) {
throw new IncorrectCredentialsException("密码错误");
}
SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(user, user.getPassword(), getName());
return authenticationInfo;
}
}
```
4. 配置shiroFilterFactoryBean
在配置类中配置shiroFilterFactoryBean,用于拦截请求,并进行认证和授权。
```java
@Bean
public ShiroFilterFactoryBean shiroFilterFactoryBean(DefaultWebSecurityManager securityManager) {
ShiroFilterFactoryBean filterFactoryBean = new ShiroFilterFactoryBean();
filterFactoryBean.setSecurityManager(securityManager);
filterFactoryBean.setLoginUrl("/login");
filterFactoryBean.setUnauthorizedUrl("/unauthorized");
Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
filterChainDefinitionMap.put("/login", "anon");
filterChainDefinitionMap.put("/logout", "logout");
filterChainDefinitionMap.put("/**", "authc");
filterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
return filterFactoryBean;
}
```
5. 配置securityManager
在配置类中配置securityManager,将自定义Realm添加到securityManager中。
```java
@Bean
public DefaultWebSecurityManager securityManager() {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
securityManager.setRealm(customRealm());
return securityManager;
}
```
6. 配置shiro的注解支持
在配置类中配置shiro的注解支持,用于在Controller中使用@RequiresRoles和@RequiresPermissions注解。
```java
@Bean
public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(DefaultWebSecurityManager securityManager) {
AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor();
advisor.setSecurityManager(securityManager);
return advisor;
}
```
7. 编写Controller
编写Controller,用于处理登录请求。
```java
@Controller
public class LoginController {
@GetMapping("/login")
public String login() {
return "login";
}
@PostMapping("/login")
public String doLogin(String username, String password) {
Subject subject = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
try {
subject.login(token);
return "redirect:/index";
} catch (UnknownAccountException e) {
return "login";
} catch (IncorrectCredentialsException e) {
return "login";
}
}
@GetMapping("/logout")
public String logout() {
Subject subject = SecurityUtils.getSubject();
subject.logout();
return "redirect:/login";
}
@GetMapping("/unauthorized")
public String unauthorized() {
return "unauthorized";
}
}
```
以上就是SpringBoot整合shiro框架实现登录认证的流程及原理。
阅读全文