本文只是大致说明 做个笔记, 详细叙述就不说明了
权限控制一般分为以下两种
*粗粒度权限控制: 如果用户没有登陆,则不能访问系统的功能, 如果用户登陆, 则能访问系统功能
*细粒度权限控制: 操作的权限控制或菜单的权限控制
1. 现在spring xml文件中配置需要拦截的请求或页面, 例如下图所示
先解释上图出现的权限控制说明
anon: 可以被匿名访问 即无需登陆即可访问
authc: 必须登陆后才能访问的页面
user: 经过验证的登陆(就是输入账号密码登陆), 或者经过勾选自动登录后的登陆
roles: 要求该用户需要有方括号中的角色才能访问或执行请求
roles[xxx,yyy]: 内部的xxx和yyy角色是并的关系, 要求用户拥有两个角色才能访问或执行请求
user,roles: 如果有两个 两者的关系是并, 要求用户要满足user和拥有指定角色
有了上述配置后有几个问题,
1. 勾选记住我验证登陆后, 关闭浏览器在打开, 直接访问登陆界面, 会发现还是停留在登陆界面, 不会跳转到指定页, 如果想要满足这个需求, 需要写一个拦截登陆界面的拦截器
示例代码
@WebFilter("/landPage.jsp") public class LandingFilter implements Filter { @Override public void destroy(){} @Override public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) resp; Subject currentUser = SecurityUtils.getSubject(); /** * 如果满足记住我登陆的或者验证登陆的, 就跳转到指定页面 */ if(currentUser.isAuthenticated() || currentUser.isRemembered()) { //跳转到目标页面 } chain.doFilter(request, response); } @Override public void init(FilterConfig fConfig) {} }
currentUser.isAuthenticated() 验证登陆这个就为true
currentUser.isRemembered() 如果登陆勾选记住我登陆 这个就是true
2. 对于roles[xxx,yyy]需要同时满足两个角色, 但如果只要满足一个即可, 对于这个需求 需要
继承 AuthorizationFilter并重写isAccessAllowed()方法
public class RolesAuthorizationFilter extends AuthorizationFilter { @Override protected boolean isAccessAllowed(ServletRequest servletRequest, ServletResponse servletResponse, Object mappedValue) throws Exception { Subject subject = getSubject(servletRequest, servletResponse); //配置的访问所需角色 String[] rolesArray = (String[]) mappedValue; if(rolesArray == null || rolesArray.length == 0) { return true; } //如果有一个角色满足,则可以访问 for(String roleName: rolesArray) { if(subject.hasRole(roleName)) { return true; } } return false; } }并在spring配置该bean, id属性名称必须和roles[xxx,yyy]的roles一致
<bean id="roles" class="your.package.RolesAuthorizationFilter"/>
3. 如果想以代码的形式配置下面这一块
只需要写一个factory方法
public class FilterChainDefinitionMapBuilder { public LinkedHashMap<String, String> buildFilterChainDefinitionMap() { LinkedHashMap<String, String> map = new LinkedHashMap<>(); map.put("/landPage.jsp", "anon"); map.put("/registerPage.jsp", "anon"); map.put("/land", "anon"); map.put("/register", "anon"); map.put("/logout", "anon"); map.put("/validate", "anon"); map.put("/edit/*", "user,roles[teacher,admin]"); map.put("/add", "user,roles[teacher,admin]"); map.put("/delete/*", "user,roles[admin]"); map.put("/**", "user"); return map; } }
xml配置如下