@Bean
public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
shiroFilterFactoryBean.setSecurityManager(securityManager);
// 登录
shiroFilterFactoryBean.setLoginUrl("/login");
// 首页
shiroFilterFactoryBean.setSuccessUrl("/index");
// 错误页面,认证不通过跳转,没有权限的页面
shiroFilterFactoryBean.setUnauthorizedUrl("/err");
Map<String, String> map = new LinkedHashMap<>();
// 以下页面、接口可以直接访问,不需要登录
// 登出
map.put("/logout", "logout");
map.put("/login.jsp", "anon");
map.put("/login", "anon");
// xzq添加
map.put("/css/**", "anon");
map.put("/fonts/**", "anon");
map.put("/img/**", "anon");
map.put("/js/**", "anon");
map.put("/lib/**", "anon");
// 以下资源需要授权
List<APermission> list = permissionMapper.list();
// 格式: 资源:权限名称 /user/list : perms[user:list]
for (APermission permission : list) {
map.put(permission.getMethodFullName(), "perms[" + permission.getPermissionName() + "]");
}
map.put("/iot_add_datatemplate", "perms[user:d]");
// 所有的资源都需要登录
map.put("/**", "authc");
shiroFilterFactoryBean.setFilterChainDefinitionMap(map);
return shiroFilterFactoryBean;
}
/**
* 授权
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
// 保存该用户名拥有的权限,可以保存为全局常量,用户名
String username = (String) principals.getPrimaryPrincipal();
// 授权信息
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
// 判断该用户在Redis中是否有相应的角色,判断该用户在Redis中是否有相应的权限
Set<String> roleList = RedisUtils.getSet(role_username);
Set<String> permissionsSet = RedisUtils.getSet(auth_username);
if (!permissionsSet.isEmpty() && !roleList.isEmpty()) {
// 赋予角色
info.addRoles(roleList);
// 赋予权限
info.addStringPermissions(permissionsSet);
return info;
}
// 通过用户名到数据库查询用户所拥有的角色
Set<String> roles = roleMapper.getByUsername(username);
RedisUtils.setSet(role_username, roles, 30);
// 通过用户名到数据库查询用户所拥有的角色,角色所拥有的权限(资源) 权限名称
Set<String> permissions = permissionMapper.getPermissionNameByUsername(username);
// 格式
permissions.add("user:a");
RedisUtils.setSet(auth_username, permissions, 30);
// 授权信息
// 将角色赋予用户
info.addRoles(roles);
// 将权限赋予角色
info.addStringPermissions(permissions);
return info;
}