@TOC
SpringBoot集成Shiro的思路
一、引入MAVEN依赖
<!--引入shrio-->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring-boot-starter</artifactId>
<version>1.5.3</version>
</dependency>
二、配置ShiroConfig
@Configuration
public class ShiroConfig {
/**
* 创建自定义Realm(认证和授权)
* @return 返回realm
*/
@Bean
public Realm getRealm() {
LoginRealm realm = new LoginRealm();
return realm;
}
/**
* 创建安全管理器
* @param realm
* @return
*/
@Bean
public DefaultWebSecurityManager getDefaultWebSecurityManager(Realm realm) {
//默认安全管理器
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
securityManager.setRealm(realm);
return securityManager;
}
/**
* shiro filter过滤全部的请求
* @param securityManager 安全管理器
* @return shiro的过滤工厂
*/
@Bean
public ShiroFilterFactoryBean getShiroFilterFactoryBean(DefaultWebSecurityManager securityManager){
//定义一个shiro过滤工厂
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
//给ShiroFilter配置安全管理器
shiroFilterFactoryBean.setSecurityManager(securityManager);
// 设置默认登录的 URL,身份认证失败会访问该 URL
shiroFilterFactoryBean.setLoginUrl("/index/toLogin");
// 设置未授权界面,权限认证失败会访问该 URL
shiroFilterFactoryBean.setUnauthorizedUrl("/403.jsp");
//配置系统受限资源
//配置系统公共资源
Map<String, String> map = new HashMap<>();
map.put("/static/**", "anon"); // anon 表示不需要认证
map.put("/index/toLogin","anon");//表示这个为公共资源 一定是在受限资源上面,方形的资源需要在受限的资源上面。
map.put("/user/login", "anon"); // anon 表示不需要认证
map.put("/user/register", "anon"); // anon 表示不需要认证
map.put("/user/toRegister", "anon"); // anon 表示不需要认证
map.put("/**","authc");//表示这个受限资源需要认证和授权
shiroFilterFactoryBean.setFilterChainDefinitionMap(map);
return shiroFilterFactoryBean;
}
}
三、自定义Realm
public class LoginRealm extends AuthorizingRealm {
/**
* 授权
* @param principalCollection
* @return
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
return null;
}
/**
* 身份认证
* @param authenticationToken
* @return
* @throws AuthenticationException
*/
@Override
@Primary
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
//获取用户名称
String principal = (String) authenticationToken.getPrincipal();
//获取用户密码
String credentials = new String((char[]) authenticationToken.getCredentials());
if ("123".equals(principal)) {
return new SimpleAuthenticationInfo(principal,"123",this.getName());
}
return null;
}
}
四、登录后台修改
/**
* 用户登录
* @param loginVo
* @return
*/
@PostMapping("login")
public ResultModel login(LoginVo loginVo){
//shiro加入身份验证
Subject subject = SecurityUtils.getSubject();
try {
//创建用户名密码token
subject.login(new UsernamePasswordToken(loginVo.getUserName(), loginVo.getUserPwd()));
return ResultModel.success("登录成功", null);
}catch (UnknownAccountException e){
e.printStackTrace();
System.out.println("用户错误!!!");
}catch (IncorrectCredentialsException e) {
System.out.println("密码错误!!!");
}
return ResultModel.error("登录失败");
}
五、用户登出
@RequestMapping("toLogout")
public String toLogout(){
Subject subject = SecurityUtils.getSubject();
subject.logout();
return "index/login";
}