下面我将为你详细讲解Spring Boot中整合Shiro实现权限管理的攻略。
一、前置知识
在学习本篇攻略之前,需要掌握以下知识:
- Spring Boot基础知识
- Shiro基础知识
- Maven依赖管理
二、步骤
1. 引入依赖
首先,我们需要在pom.xml
文件中引入以下依赖:
<!-- Shiro -->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.5.3</version>
</dependency>
2. 配置Shiro
在application.yml
文件中添加Shiro的配置:
shiro:
filterChainDefinitions: "/login = anon\n/** = authc"
loginUrl: "/login"
successUrl: "/"
filterChainDefinitions
表示访问路径拦截规则,本示例中表示/login
路径不需要认证,其他路径需要认证。loginUrl
表示登录页面的路径。successUrl
表示认证成功后跳转的路径。
3. 实现Shiro的自定义Realm
接下来,我们需要实现自定义的Realm,来进行身份认证和权限校验。
public class MyRealm extends AuthorizingRealm {
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
authorizationInfo.addRole("admin");
authorizationInfo.addStringPermission("user:list");
return authorizationInfo;
}
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
UsernamePasswordToken upToken = (UsernamePasswordToken) token;
String username = upToken.getUsername();
String password = new String(upToken.getPassword());
if ("admin".equals(username) && "admin".equals(password)) {
return new SimpleAuthenticationInfo(username, password, getName());
}
throw new AuthenticationException("认证失败");
}
}
在上面的代码中,我们实现了doGetAuthenticationInfo
方法进行身份认证,实现doGetAuthorizationInfo
方法进行权限校验。在doGetAuthorizationInfo
方法中,我们将角色和权限添加到AuthorizationInfo对象中。
4. 配置SecurityManager
现在我们已经实现了自定义的Realm,接下来需要将它配置到SecurityManager中。
@Configuration
public class ShiroConfig {
@Bean
public SecurityManager securityManager(MyRealm myRealm) {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
securityManager.setRealm(myRealm);
return securityManager;
}
@Bean
public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {
ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean();
shiroFilter.setSecurityManager(securityManager);
Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
filterChainDefinitionMap.put("/static/**", "anon");
filterChainDefinitionMap.put("/login", "anon");
filterChainDefinitionMap.put("/**", "authc");
shiroFilter.setFilterChainDefinitionMap(filterChainDefinitionMap);
shiroFilter.setLoginUrl("/login");
shiroFilter.setSuccessUrl("/");
return shiroFilter;
}
}
在securityManager
方法中,我们将自定义的Realm配置到了SecurityManager中;在shiroFilter
方法中,我们设置了SecurityManager,并配置了过滤规则和登录和成功跳转页面。
5. 编写登录页面和主页
根据上面的配置,我们需要配置两个页面:登录页面和主页。登录页面配置/login
路径,主页配置/
路径。
6. 编写Controller
在Controller中,我们需要添加两个方法:登录方法和主页方法。
@Controller
public class LoginController {
@RequestMapping("/login")
public String login() {
return "login";
}
@RequestMapping("/")
public String index() {
return "index";
}
}
7. 完成测试
最后,我们运行项目,输入账号密码进行登录,成功后跳转到主页。
三、示例说明
示例1:配置Shiro的过滤规则
在上面的步骤中,我们在application.yml
文件中设置了Shiro的过滤规则,这里使用的是Ant Path Matcher规则。在实际项目中,我们可能需要使用正则表达式等其他规则,这时候就需要使用Shiro提供的其他过滤器。
示例2:自定义Realm
在本文的示例代码中,我们实现了自定义的Realm来进行身份认证和权限校验。在实际项目中,我们可能需要根据公司业务需要进行更加复杂的身份认证和权限校验,这时候就需要对Realm进行更加复杂的实现。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot中整合Shiro实现权限管理的示例代码 - Python技术站