在当今这个信息时代,网络安全变得越来越重要。Shiro是一个功能强大且易于使用的Java安全框架,它提供了身份验证、授权、加密和会话管理等功能。Bootstrap(Boot)则是一个流行的前端框架,它可以帮助我们快速开发响应式网站。将Shiro集成到Boot项目中,可以实现前后端分离的安全管理,提高系统的安全性。本文将带你从入门到实战,掌握Boot集成Shiro的安全认证与授权技巧。
一、Shiro简介
Shiro是一个强大且易于使用的Java安全框架,它为应用提供身份验证、授权、加密和会话管理等功能。Shiro的核心功能包括:
- Subject:主体,当前用户。
- SecurityManager:安全管理器,负责管理内部组件的运行。
- Realm:域,用于获取Subject相关的数据,如用户、角色、权限等。
- Session:会话,用户与系统交互的会话。
- SessionManager:会话管理器,负责管理Session的生命周期。
- Authentication:认证,即用户身份验证。
- Authorization:授权,即用户权限验证。
二、Boot集成Shiro
1. 创建Boot项目
首先,你需要创建一个Boot项目。这里以Spring Boot 2.2.5版本为例,你可以使用Spring Initializr(https://start.spring.io/)快速生成一个项目。
2. 添加Shiro依赖
在项目的pom.xml文件中,添加以下Shiro依赖:
<dependencies>
<!-- Shiro核心依赖 -->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.7.1</version>
</dependency>
<!-- Shiro集成Spring -->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.7.1</version>
</dependency>
<!-- 其他依赖 -->
<!-- ... -->
</dependencies>
3. 配置Shiro
在application.properties或application.yml文件中,添加Shiro配置:
# Shiro配置
shiro.login.url=/login
shiro.unauthorized.url=/unauthorized
shiro.session.timeout=1800
shiro.cacheManager.sessionCacheName=shiroSessionCache
4. 创建Shiro Realm
创建一个继承自AuthorizingRealm的Shiro Realm,用于获取用户、角色、权限等数据:
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
public class MyRealm extends AuthorizingRealm {
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
// 根据用户名查询用户信息
// ...
return null;
}
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
// 根据用户信息获取角色和权限
// ...
return new SimpleAuthorizationInfo();
}
}
5. 配置Shiro安全管理器
在ShiroConfig类中,配置Shiro安全管理器:
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.realm.Realm;
import org.apache.shiro.session.Session;
import org.apache.shiro.session.mgt.SessionManager;
import org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionManager;
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;
@Configuration
public class ShiroConfig {
@Bean
public SecurityManager securityManager(Realm myRealm) {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
securityManager.setRealm(myRealm);
return securityManager;
}
@Bean
public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
shiroFilterFactoryBean.setSecurityManager(securityManager);
// 配置登录、注销、无权限访问页面
// ...
return shiroFilterFactoryBean;
}
@Bean
public SessionManager sessionManager() {
EnterpriseCacheSessionManager sessionManager = new EnterpriseCacheSessionManager();
// 配置会话管理
// ...
return sessionManager;
}
@Bean
public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {
AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor();
advisor.setSecurityManager(securityManager);
return advisor;
}
}
6. 登录、注销和权限验证
在Controller中,实现登录、注销和权限验证功能:
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class LoginController {
@PostMapping("/login")
public String login(String username, String password) {
try {
Subject subject = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
subject.login(token);
return "登录成功";
} catch (AuthenticationException e) {
return "登录失败:" + e.getMessage();
}
}
@GetMapping("/logout")
public String logout() {
SecurityUtils.getSubject().logout();
return "注销成功";
}
@GetMapping("/admin")
public String admin() {
if (SecurityUtils.getSubject().isPermitted("admin")) {
return "欢迎进入管理员页面";
} else {
return "您没有权限访问该页面";
}
}
}
三、总结
本文从Shiro简介、Boot集成Shiro、配置Shiro Realm、配置Shiro安全管理器、登录、注销和权限验证等方面,详细介绍了如何将Shiro集成到Boot项目中,实现安全认证与授权。通过学习本文,你可以轻松上手Boot集成Shiro,掌握安全认证与授权技巧。在实际开发过程中,你还可以根据项目需求,对Shiro进行扩展和定制。