在企业级应用开发中,权限管理和用户认证是非常重要的组成部分。Spring Boot 以其便捷的配置和快速的开发流程而受到开发者们的青睐。Apache Shiro 是一个强大且易用的 Java 安全框架,可以非常容易地开发出足够安全的应用。本文将介绍如何在 Spring Boot 应用中集成 Apache Shiro 来实现权限管理。
一、环境准备
-
开发工具:
-
IntelliJ IDEA 或 Eclipse
-
Maven
-
Java 11+
-
项目初始化:
-
使用 Spring Initializr 创建一个新的 Spring Boot 项目。
-
添加 Web 和 JPA 依赖。
-
添加 Shiro 依赖: 在 pom.xml 文件中添加 Shiro 的相关依赖。
xml
深色版本
1<dependencies>
2 <!-- Shiro -->
3 <dependency>
4 <groupId>org.apache.shiro</groupId>
5 <artifactId>shiro-spring</artifactId>
6 <version>1.12.4</version>
7 </dependency>
8 <dependency>
9 <groupId>org.apache.shiro</groupId>
10 <artifactId>shiro-ehcache</artifactId>
11 <version>1.12.4</version>
12 </dependency>
13 <!-- 其他依赖 -->
14</dependencies>
二、配置文件
-
application.properties:
-
properties
-
深色版本
-
1# Shiro 配置 2shiro.cacheManager.ehCacheManager.shared=true
-
ShiroConfig.java: 这里我们定义 Shiro 的配置类。
java
深色版本
1@Configuration
2public class ShiroConfig {
3
4 @Bean
5 public SecurityManager securityManager() {
6 DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
7 securityManager.setRealm(myShiroRealm());
8 securityManager.setCacheManager(cacheManager());
9 return securityManager;
10 }
11
12 @Bean
13 public MyShiroRealm myShiroRealm() {
14 return new MyShiroRealm();
15 }
16
17 @Bean
18 public CacheManager cacheManager() {
19 return new EhCacheManager();
20 }
21
22 @Bean
23 public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {
24 ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();
25 factoryBean.setSecurityManager(securityManager);
26 Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
27 // 设置匿名访问路径
28 filterChainDefinitionMap.put("/login", "anon");
29 // 设置需要认证的路径
30 filterChainDefinitionMap.put("/**", "authc");
31 factoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
32 return factoryBean;
33 }
34}
三、自定义 Realm
-
MyShiroRealm.java: 实现 AuthorizingRealm 接口来定义认证逻辑。
java
深色版本
1@Component
2public class MyShiroRealm extends AuthorizingRealm {
3
4 @Override
5 protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
6 // 从 token 中获取用户名
7 String username = (String) token.getPrincipal();
8 // 查询数据库验证用户名和密码
9 if ("admin".equals(username) && "password".equals(token.getCredentials().toString())) {
10 return new SimpleAuthenticationInfo(username, "password", getName());
11 }
12 throw new UnknownAccountException();
13 }
14
15 @Override
16 protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
17 String username = (String) principals.getPrimaryPrincipal();
18 // 查询数据库获取该用户的权限信息
19 if ("admin".equals(username)) {
20 SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
21 info.addRole("admin");
22 info.addStringPermission("user:read");
23 return info;
24 }
25 return null;
26 }
27}
四、控制器与视图
-
LoginController.java: 实现登录功能。
java
深色版本
1@Controller
2public class LoginController {
3
4 @GetMapping("/login")
5 public String login() {
6 return "login";
7 }
8
9 @PostMapping("/login")
10 public String login(@RequestParam String username, @RequestParam String password, Model model) {
11 try {
12 Subject currentUser = SecurityUtils.getSubject();
13 UsernamePasswordToken token = new UsernamePasswordToken(username, password);
14 currentUser.login(token);
15 return "redirect:/dashboard";
16 } catch (UnknownAccountException e) {
17 model.addAttribute("error", "未知账户!");
18 return "login";
19 } catch (IncorrectCredentialsException e) {
20 model.addAttribute("error", "密码错误!");
21 return "login";
22 }
23 }
24}
五、总结
通过上述步骤,我们成功地在 Spring Boot 应用中集成了 Apache Shiro,并实现了基本的权限管理。当然,实际应用中还需要考虑更多的细节,比如更复杂的权限判断逻辑、异常处理、多数据源支持等。希望这篇博客能为你的项目提供一些有用的参考。