shiro的使用
Posted 你就是我
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shiro的使用相关的知识,希望对你有一定的参考价值。
-
-
Authentication 认证
-
Authorization 授权
-
principal 首要的,本金,校长
-
-
shiro三大对象
-
Subject 用户
-
SecurityManager 管理用户
-
使用步骤
-
导入依赖
<dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>1.7.1</version> </dependency>
-
创建配置类,创建三个返回shiro主要对象的方法
-
ShiroFilterFactorBean 3 用途:拦截请求,定义拦截后返回的页面
-
-
DefaultWebSecurityManger 2
-
UserRealm 1
-
@Configuration
public class ShiroConfig {
//ShiroFilterFactoryBean 3
@Bean
public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager") DefaultWebSecurityManager defaultWebSecurityManager){
ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();
//设置安全管理器(根据权限,拦截请求)
bean.setSecurityManager(defaultWebSecurityManager);
//添加shiro内置过滤器
/*过滤的属性
* anon:无需认证就可以访问
* authc:必须认证
* user:必须拥有记住我功能才可以使用。不用
* perms:拥有对某个资源的权限才可以访问
* role:拥有某个角色可以访问
* 下面四行代码完成登陆拦截功能
* */
//拦截
Map<String, String> filterMap=new HashMap<>();
//授权信息配置
filterMap.put("/user/*","perms[user:add]");//表示是一个user请求,有add权限
filterMap.put("/level1/user/*","perms[user:update]");
filterMap.put("/level2/user/*","authc");
bean.setFilterChainDefinitionMap(filterMap);
//设置自定义登陆页面
bean.setLoginUrl("/toLogin");
//设置未授权页面
bean.setUnauthorizedUrl("/unAuth");
return bean;
}
//DefaultWebSecurityManager 2
@Bean(name = "securityManager")
public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
//中间商,关联管理UserRealm
securityManager.setRealm(userRealm);
return securityManager;
}
//创建 realm 对象,需要自定义对象 1
@Bean
public UserRealm userRealm(){
return new UserRealm();
}
//整合ShiroDialect:用来整合 shiro thymeleaf
@Bean
public ShiroDialect getShiroDialect(){
return new ShiroDialect();
}
} -
创建一个继承AuthorizingRealm的UserRealm类,用途:认证登陆信息。
public class UserRealm extends AuthorizingRealm { //授权与认证 @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { System.out.println("执行了=>授权doGetAuthorizationInfo"); return null; } @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { System.out.println("执行了=>认证doGetAuthorizationInfo"); //认证操作:用户名,密码 String username="root"; String password="123"; UsernamePasswordToken userToken= (UsernamePasswordToken) token; if (!username.equals(userToken.getUsername())){ return null; } //密码认证,shiro自己认证 return new SimpleAuthenticationInfo("",password,""); } }
//授权信息配置 filterMap.put("/user/*","perms[user:add]");//表示一个user用户,有add权限
- UserRealm(验证规则配置)类中,认证方法new SimpleAuthenticationInfo( principle,,)principle传入后端获取的user对象
@Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { System.out.println("执行了=>认证doGetAuthorizationInfo"); //根据前端获取的用户名,密码,认证登陆 User user = new User("root", "123", "12", "user:add");//模拟从数据库中获取用户信息 String username="root"; String password="123"; //获取前端获取的用户和密码 UsernamePasswordToken userToken= (UsernamePasswordToken) token; if (!username.equals(userToken.getUsername())){ return null; } //登陆成功后,将user保存到session中 Subject currentSubject = SecurityUtils.getSubject(); Session session = currentSubject.getSession(); session.setAttribute("username",user.getName()); //密码认证,shiro自己认证 return new SimpleAuthenticationInfo(user,password,""); }
以上是关于shiro的使用的主要内容,如果未能解决你的问题,请参考以下文章