shiro框架在springboot中如何集成

avatar
作者
筋斗云
阅读量:0

Apache Shiro 是一个强大且易用的 Java 安全框架,用于身份验证、授权、加密和会话管理。在 Spring Boot 中集成 Shiro 相对简单,以下是一些关键步骤:

1. 添加依赖

首先,在你的 pom.xml 文件中添加 Shiro 和 Spring Boot Shiro 相关的依赖:

<dependencies>     <!-- Shiro Core -->     <dependency>         <groupId>org.apache.shiro</groupId>         <artifactId>shiro-core</artifactId>         <version>1.7.1</version>     </dependency>     <!-- Spring Boot Shiro Starter -->     <dependency>         <groupId>org.apache.shiro</groupId>         <artifactId>shiro-spring-boot-starter</artifactId>         <version>1.7.1</version>     </dependency>     <!-- Spring Boot Starter Web -->     <dependency>         <groupId>org.springframework.boot</groupId>         <artifactId>spring-boot-starter-web</artifactId>     </dependency> </dependencies> 

确保你使用的 Shiro 和 Spring Boot 版本兼容。

2. 配置 Shiro

创建一个配置类来设置 Shiro。例如,你可以创建一个名为 ShiroConfig 的类:

import org.apache.shiro.mgt.SecurityManager; 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() {         DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();         // 设置用户和角色         securityManager.setRealm(myRealm());         return securityManager;     }      @Bean     public MyRealm myRealm() {         return new MyRealm();     }      @Bean     public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {         ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();         shiroFilterFactoryBean.setSecurityManager(securityManager);          // 配置过滤器链         Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();         filterChainDefinitionMap.put("/admin/**", "authc");         filterChainDefinitionMap.put("/**", "anon");         shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);          return shiroFilterFactoryBean;     } } 

在这个例子中,我们定义了一个自定义的 Realm(MyRealm),用于处理身份验证和授权逻辑。ShiroFilterFactoryBean 用于配置过滤器链,定义哪些 URL 需要身份验证,哪些不需要。

3. 实现自定义 Realm

创建一个自定义的 Realm 类来实现 org.apache.shiro.realm.AuthorizingRealm 接口。例如:

import org.apache.shiro.authc.*; import org.apache.shiro.authz.AuthorizationInfo; import org.apache.shiro.authz.SimpleAuthorizationInfo; import org.apache.shiro.realm.AuthorizingRealm; import org.apache.shiro.subject.PrincipalCollection;  import java.util.HashSet; import java.util.Set;  public class MyRealm extends AuthorizingRealm {      @Override     protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {         String username = (String) principals.getPrimaryPrincipal();         // 查询用户角色和权限         Set<String> roles = getRolesForUser(username);         Set<String> permissions = getPermissionsForUser(username);          SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();         authorizationInfo.setRoles(roles);         authorizationInfo.setStringPermissions(permissions);         return authorizationInfo;     }      @Override     protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {         UsernamePasswordToken upToken = (UsernamePasswordToken) token;         String username = upToken.getUsername();          // 查询用户信息         User user = getUserByUsername(username);         if (user == null) {             throw new UnknownAccountException("用户不存在");         }          return new SimpleAuthenticationInfo(user.getUsername(), user.getPassword(), getName());     }      private Set<String> getRolesForUser(String username) {         // 实现获取用户角色的逻辑         return new HashSet<>();     }      private Set<String> getPermissionsForUser(String username) {         // 实现获取用户权限的逻辑         return new HashSet<>();     }      private User getUserByUsername(String username) {         // 实现根据用户名查询用户的逻辑         return null;     } } 

在这个例子中,我们实现了 doGetAuthorizationInfodoGetAuthenticationInfo 方法,用于处理授权和身份验证逻辑。

4. 创建用户和角色

你需要创建一些用户和角色数据来测试 Shiro。这些数据可以存储在数据库中,或者简单地硬编码在配置类中。例如:

import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;  import java.util.HashMap; import java.util.Map;  @Configuration public class UserRolesConfig {      @Bean     public Map<String, String> users() {         Map<String, String> users = new HashMap<>();         users.put("admin", "admin_password");         users.put("user", "user_password");         return users;     }      @Bean     public Map<String, Set<String>> roles() {         Map<String, Set<String>> roles = new HashMap<>();         Set<String> adminRoles = new HashSet<>();         adminRoles.add("admin");         roles.put("admin", adminRoles);          Set<String> userRoles = new HashSet<>();         userRoles.add("user");         roles.put("user", userRoles);          return roles;     } } 

在这个例子中,我们定义了两个 Bean:usersroles,分别存储用户名和密码,以及用户的角色信息。

5. 测试 Shiro

现在你可以启动你的 Spring Boot 应用,并测试 Shiro 的身份验证和授权功能。例如,你可以尝试访问 /admin/** URL,看看是否需要身份验证,以及能否正确访问受保护的资源。

以上就是在 Spring Boot 中集成 Apache Shiro 的基本步骤。你可以根据自己的需求进一步扩展和定制 Shiro 的配置和功能。

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!