//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;
SysUsersinsert user =(// 获取以后类对强转一下像转换 SysUsersinsert)principals.getPrimaryPrincipal();
List<String> 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<String> 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);
}
//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<String,String> 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;
}
@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();
}