整合Shiro第一种方式
导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-web</artifactId>
<version>1.4.0</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.4.0</version>
</dependency>
创建MyRealm类并继承AuthorizingRealm在Realm中实现简单的认证操作即可,不做授权
public class MyRealm extends AuthorizingRealm {
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
return null;
}
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
String username = (String) token.getPrincipal();
if("admin".equals(username)){
//getName()是MyRealm的实例数量
return new SimpleAuthenticationInfo(username,"123",getName());
}
return null;
}
}
创建ShiroConfig
在这里进行
Shiro 的配置主要配置 3 个 Bean :
首先需要提供一个Realm 的实例。
需要配置一个SecurityManager,在 SecurityManager 中配置 Realm。
配置一个ShiroFilterFactoryBean ,在 ShiroFilterFactoryBean 中指定路径拦截规则等。
配置登录和测试接口。
其中,ShiroFilterFactoryBean的配置稍微多一些,配置含义如下:
setSecurityManager 表示指定 SecurityManager。
setLoginUrl表示指定登录页面。
setSuccessUrl表示指定登录成功页面。
接下来的 Map中配置了路径拦截规则,注意,要有序。
@Configuration
public class ShiroConfig {
@Bean
MyRealm myRealm() {
return new MyRealm();
}
@Bean
SecurityManager securityManager(){
DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager();
defaultWebSecurityManager.setRealm(myRealm());
return defaultWebSecurityManager;
}
@Bean
ShiroFilterFactoryBean shiroFilterFactoryBean(){
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
shiroFilterFactoryBean.setSecurityManager(securityManager());
shiroFilterFactoryBean.setLoginUrl("/login");
shiroFilterFactoryBean.setSuccessUrl("/welcome");
Map<String,String> map = new LinkedHashMap<>();
//登录地址匿名访问
map.put("/dologin","anon");
//剩下的地址,认证后访问
map.put("/**", "authc");
//自定义拦截规则
shiroFilterFactoryBean.setFilterChainDefinitionMap(map);
return shiroFilterFactoryBean;
}
}
创建Controller用来测试
@RestController
public class HelloController {
@GetMapping("/login")
public String login() {
return "please login";
}
@PostMapping("/dologin")
public String dologin(String username,String password) {
Subject subject = SecurityUtils.getSubject();
try {
subject.login(new UsernamePasswordToken(username,password));
return "success";
} catch (AuthenticationException e) {
e.printStackTrace();
return e.getMessage();
}
}
@GetMapping("/welcome")
public String hello(){
return "hello";
}
}