shiro框架
认证模块
AuthenticationInfo
同时还得配置controller层,使用subject
//1.需要从token中获得用户名级密码怎么办?
UsernamePasswordToken Utoken = (UsernamePasswordToken)token; //token强转成子类对象可获得
String username = Utoken.getUsername();
token(将token类型强转为他的子类usernamepasswordToken类型),以便获取账户和密码
//2.从数据库查询?
通过当前用户的登录的username查询数据库是否有对应的用户信息
SysUsersinsert sysusers = sysuserdao.selectById(username);
//3.对查询结构进行判断?
if(sysusers==null)
throw new UnknownAccountException();//没有找到异常
//3.1判断是否被锁定?
if(sysusers.getvalid()==0)
throw new LockedAccountException();//用户名被锁定异常
/4.封装用户信息并返回.?不知道返回的是什么,看方法的返回值
//由于盐值传递的必须是要转换一下
ByteSource credentialsSalt = ByteSource.Util.bytes(sysusers.getSalt());
SimpleAuthenticationInfo info =
new SimpleAuthenticationInfo(
sysusers, // 用户身份
sysusers.getPassword(), //数据库的密码(已被加密)
credentialsSalt, //盐值
getName());//认证对象返回
return info;
授权模块
AuthorizationInfo
获取当前对象
SysUsersinsert user =( //获取当前类对强转一下像转换 SysUsersinsert)principals.getPrimaryPrincipal();
基于菜单id查询授权标识并校验
注意需要授权的业务在业务方法上加入注解@RequiresPermissions("sys:user:update")
List menusSTRING = sysmenudao.findMenusStringprop(menuids);
if(menusSTRING==null||menusSTRING.size()==0)
throw new AuthorizationException();
封装查询结果并返回
SimpleAuthorizationInfo sim = new SimpleAuthorizationInfo();
sim.setStringPermissions(stringPermissions);
return sim;
//由于 sim.setStringPermissions(stringPermissions) 需要传入一个List类型所以创建一个集合
Set stringPermissions=new HashSet<>();
for (String pre : menusSTRING) {
if(pre!=null&&!"".equals(pre)) {
stringPermissions.add(pre);
}
}
还需要配置凭证匹配器
//设置凭证匹配器:还有一种方式为get
@Override
public void setCredentialsMatcher(CredentialsMatcher credentialsMatcher) {
//构建匹配器对象
HashedCredentialsMatcher credent = new HashedCredentialsMatcher();
//设置加密算法
credent.setHashAlgorithmName("MD5");
//设计几次加密与添加用户时相同次数
credent.setHashIterations(1);
super.setCredentialsMatcher(credent);
}
shiro框架的手动配置
超级管理员SecurityManager
//Realm 是认证和授权的两个实现类的一个大接口好处是实现了多态减少代码的编写
@Bean
public SecurityManager SecurityManager(Realm realm){
DefaultWebSecurityManager securityManager=
new DefaultWebSecurityManager();
securityManager.setRealm(realm);
return securityManager;
}
//如果需要配置缓存将缓存对象也得注入给securityManager对象
CacheManager 缓存对象
RememberMeManager 记住我对象
//将两个同时注入到SecurityManager之中 ji'ke
//添加shiro框架的cache缓存
@Bean
public CacheManager newcacheMange() {
return new MemoryConstrainedCacheManager();
}
授权管理配置
/** 授权管理操作时
* 首先在springboot项目中只需要配置Advison,其他两个配置由spring底层自动配置
* 配置shiro中的Advison对象,此对象在spring框架启动时用于告知spring框架要为那些切入点描述对象创建代理对象
*/
@Bean
public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {
AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor();
advisor.setSecurityManager(securityManager);
return advisor;
}
手动添加认证跳转信息(模板)
//设置通过此对象设置资源匿名访问、认证访问。关键代码如下:
@Bean
public ShiroFilterFactoryBean shiroFilterFactory (SecurityManager securityManager) {
ShiroFilterFactoryBean sfBean = new ShiroFilterFactoryBean(); sfBean.setSecurityManager(securityManager);
//定义map指定请求过滤规则(哪些资源允许匿名访问,哪些必须认证访问)
sfBean.setLoginUrl("/doLoginUI"); //设置认证页LinkedHashMap map= new LinkedHashMap<>();
//静态资源允许匿名访问:"anon" map.put("/bower_components/**","anon");
map.put("/build/**","anon");
map.put("/dist/**","anon");
map.put("/plugins/**","anon");
map.put("/user/doLogin","anon");
map.put("/doLogout","anon");
//除了匿名访问的资源,其它都要认证("authc")后访问
map.put("/**","user"); sfBean.setFilterChainDefinitionMap(map); //直接加入map也可以一个的加
return sfBean;
}
使用添加依赖包的方式配置shiro
@Configuration//此注解描述的类为spring的配置类,不用把那边的业务交给spring管理了
@Configuration
public class SpringShiroConfig{
@Bean
public Realm realm() {
return new shiroAuthenSerivce();
}
//配置认证转换器
@Bean
public ShiroFilterChainDefinition shiroFilterChainDefinition() {
DefaultShiroFilterChainDefinition chainDefinition = new DefaultShiroFilterChainDefinition();
//同上可以是Map集合也一个一个的添加,最好用map
chainDefinition.setaddPathDefinitions(map);
}
//如果想要配置cache缓存、话直接配置一下代码即可
@Bean
protected CacheManager shirocacheManager() {
return new MemoryConstrainedCacheManager();
}