如何给Java环境配置最简单的Shiro环境
@Bean public SecurityManager securityManager(){ DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); //设置realm. securityManager.setRealm(userRealm()); // 自定义缓存实现 使用redis if(Constant.CACHE_TYPE_REDIS.equals(cacheType)){ securityManager.setCacheManager(cacheManager()); }else { securityManager.setCacheManager(ehCacheManager()); } securityManager.setSessionManager(sessionManager()); return securityManager; }
核心代码是前两行,讲Realm内置到SecurityManaager就可以了。因为Realm像前文讲的一样,是与系统交互的主要桥梁。
给Shiro设置Filter
@Bean ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) { ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); shiroFilterFactoryBean.setSecurityManager(securityManager); shiroFilterFactoryBean.setLoginUrl("/login"); shiroFilterFactoryBean.setSuccessUrl("/index"); shiroFilterFactoryBean.setUnauthorizedUrl("/403"); LinkedHashMap<String, String> filterChainDefinitionMap = new LinkedHashMap<>(); filterChainDefinitionMap.put("/login", "anon"); filterChainDefinitionMap.put("/css/**", "anon"); filterChainDefinitionMap.put("/js/**", "anon"); filterChainDefinitionMap.put("/fonts/**", "anon"); filterChainDefinitionMap.put("/img/**", "anon"); filterChainDefinitionMap.put("/docs/**", "anon"); filterChainDefinitionMap.put("/druid/**", "anon"); filterChainDefinitionMap.put("/upload/**", "perms[act:model:edit]"); filterChainDefinitionMap.put("/student/**","roles["admin,normal,assistant"]"); filterChainDefinitionMap.put("/logout", "logout"); filterChainDefinitionMap.put("/", "anon"); filterChainDefinitionMap.put("/**", "authc"); shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); return shiroFilterFactoryBean; }
Filter主要是给Shiro设置一切基础策略,也可以用配置文件进行配置,不过依然是需要重启应用才能生效的。
anno代表不需要授权即可访问,对于静态资源,访问权限都设置为anno
authc表示需要登录才可访问
perms[act:model:edit] 权限配置
roles["admin,normal,assistant"] 角色配置
注:非鉴权接口需要在这里面配置
Realm的一个实现
1.创建类继承 AuthorizingRealm(org.apache.shiro.realm.AuthorizingRealm)
使用此类作为父类的原因我们可以看到,其已经继承了身份认证的Realm父类
public abstract class AuthorizingRealm extends AuthenticatingRealm implements Authorizer, Initializable, PermissionResolverAware, RolePermissionResolverAware
实现doGetAuthorizationInfo方法
该方法主要是返回授权的信息,一般的做法是,用户通过认证之后,需要知道用户都有哪些页面或者哪些操作的授权。
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); info.setStringPermissions(perms);
实现doGetAuthenticationInfo方法
该方法主要是做身份认证的时候的判断逻辑
// 账号不存在 if (user == null) { throw new UnknownAccountException("账号或密码不正确"); } // 密码错误 if (!password.equals(user.getPassword())) { throw new IncorrectCredentialsException("账号或密码不正确"); } // 账号锁定 if (user.getStatus() == 0) { throw new LockedAccountException("账号已被锁定,请联系管理员"); } SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user, password, getName());
其他的方法逻辑还有很多,根据需要实现的业务逻辑添加重写即可,后面使用到了再增加文档