如何给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());
其他的方法逻辑还有很多,根据需要实现的业务逻辑添加重写即可,后面使用到了再增加文档
本文详细介绍如何在Java环境中配置Shiro权限管理框架,包括核心的SecurityManager设置、自定义缓存实现、会话管理及Filter策略配置。通过具体代码示例,讲解了Realm的实现与权限、角色的配置方法。
3039

被折叠的 条评论
为什么被折叠?



