Spring Boot整合shiro(eclipse版)
在 Spring Boot 中做权限管理,一般来说,主流的方案是 Spring Security ,但是,仅仅从技术角度来说,也可以使用 Shiro。
在 Spring Boot 中整合 Shiro ,有两种不同的方案:
- 第一种就是原封不动的,将 SSM 整合 Shiro 的配置用 Java 重写一遍。
- 第二种就是使用 Shiro 官方提供的一个 Starter 来配置,但是,这个 Starter 并没有简化多少配置。
这里演示第二种,因之后大多数都是用注解来进行开发
1、创建spring Boot工程
导入依赖
<!--主要的依赖-->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring-boot-web-starter</artifactId>
<version>1.5.3</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
2、创建Realm
定义我们自己的Realm
public class ShiroRealm extends AuthorizingRealm{
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
// TODO Auto-generated method stub
return null;
}
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
String username = (String) token.getPrincipal();
if(!"xiaobear".equals(username)) {
throw new org.apache.shiro.authc.UnknownAccountException("用户名不存在!");
}
return new org.apache.shiro.authc.SimpleAuthenticationInfo(username,"123456",getName());
}
}
在 Realm 中实现简单的认证操作即可,不做授权,授权的具体写法和 SSM 中的 Shiro 一样,不赘述。这里的认证表示用户名必须是xiaobear,用户密码必须是123456 ,满足这样的条件,就能登录成功!
3、配置Shiro
@Configuration
public class ShiroConfig {
@Bean
ShiroRealm shiroRealm() {
return new ShiroRealm();
}
@Bean
DefaultWebSecurityManager securityManager() {
DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager();
defaultWebSecurityManager.setRealm(shiroRealm());
return defaultWebSecurityManager;
}
@Bean
ShiroFilterChainDefinition shiroFilterChainDefinition() {
DefaultShiroFilterChainDefinition defaultShiroFilterChainDefinition = new DefaultShiroFilterChainDefinition();
defaultShiroFilterChainDefinition.addPathDefinition("/login", "anon");
defaultShiroFilterChainDefinition.addPathDefinition("/**", "authc");
return defaultShiroFilterChainDefinition;
}
}
在这里进行 Shiro 的配置主要配置 3 个 Bean :
- 首先需要提供一个 Realm 的实例。
- 需要配置一个 DefaultWebSecurityManager,在 SecurityManager 中配置 Realm。
- 配置一个ShiroFilterChainDefinition ,在 ShiroFilterChainDefinition 中指定路径拦截规则等。
- 配置登录和测试接口。
4、配置Shiro的基本信息
shiro:
sessionManager:
sessionIdCookieEnabled: true
sessionIdUrlRewritingEnabled: true
loginUrl: /login
successUrl: /index
unauthorizedUrl: /unauthorized
web:
enabled: true
- sessionIdCookieEnabled:表示是否允许将sessionId 放到 cookie 中
- sessionIdUrlRewritingEnabled:表示是否允许将 sessionId 放到 Url 地址拦中
- loginUrl:表示登录页面
- successUrl:表示登录成功的跳转页面
- unauthorizedUrl:表示访问未获授权的页面时,默认的跳转路径
- web:
enabled:表示开启 shiro
5、Controller
@RestController
public class LoginController {
@PostMapping("/login")
public void login(String username,String password) {
Subject subject = SecurityUtils.getSubject();
try {
subject.login(new org.apache.shiro.authc.UsernamePasswordToken(username, password));
System.out.println("登录成功!");
} catch (AuthenticationException e) {
e.printStackTrace();
System.out.println("登录失败!");
}
}
@GetMapping("/hello")
public String hello() {
return "hello";
}
@GetMapping("/tologin")
public String login() {
return "please login!";
}
}
6、遇到的错误
1、There is no filter with name ‘anno’ to apply to chain
解决办法:无访问权限直接访问的配置不是“anno”而是“anon”
@Bean
ShiroFilterChainDefinition shiroFilterChainDefinition() {
DefaultShiroFilterChainDefinition defaultShiroFilterChainDefinition = new DefaultShiroFilterChainDefinition();
defaultShiroFilterChainDefinition.addPathDefinition("/login", "anon");
defaultShiroFilterChainDefinition.addPathDefinition("/**", "authc");
return defaultShiroFilterChainDefinition;
}
2、(No bean of type ‘org.apache.shiro.realm.Realm’ found),Spring Boot不自动载入配置
解决办法:
-
首先检查自己是否在配置类上有@Configuration
-
其次是否有@Bean注解
-
网上教程说排除三个类就可以了,但这个我没遇到过,仅供参考
@SpringBootApplication(exclude = {ShiroAnnotationProcessorAutoConfiguration.class, ShiroAutoConfiguration.class, ShiroBeanAutoConfiguration.class})