这两天接触的一个项目的权限控制思路,控制页面权限、action权限、页面内容权限
1用户
2角色
3权限组
4权限
5菜单
权限控制的5个基本模块:
- 用户: 用户与角色关联
- 角色: 角色与权限关联
- 给角色赋予权限:将所有权限列出:
- 权限组:用于归类权限
- 权限:
- 权限可以是一个菜单(当权限的url和菜单的url相同时即为菜单权限)
- 获取菜单列表时根据权限过滤菜单:
-
if (menuUrl.equals(auth.getUrl()) || (user!=null && user.getId().equals(1L))) { //或者为超级用户的话也显示 menuJson.setIsHidden(false);// 有权限,显示
- 也可以为页面内容权限(当权限的url为”#***“的标识为功能权限,使用自”定义标签控制“页面内容权限的显示隐藏)
- JSP页面:
1 <auth:showhtml url="#hpgg"> 2 <%--自定义标签..需要根据权限显示隐藏的内容--%> 3 </auth:showhtml>
- JSP页面:
- 也可以是action权限(将每一个action都加到权限中,使用struts的拦截器判断action是否有url权限)
- 配置拦截器:
-
<package name="my-default" extends="json-default"> <interceptor name="loginInterceptor" class="***.*.**.LoginInterceptor" /> <interceptor name="authInterceptor" class="***.*.**.AuthInterceptor" /> <interceptors> <interceptor-stack name="loginStack"> <interceptor-ref name="authInterceptor" > <param name="excludeMethods">login,loginout</param> </interceptor-ref> </interceptor-stack> </interceptors> <default-interceptor-ref name="loginStack"></default-interceptor-ref> </package>
<package name="*" extends="my-default">
<action name="*" class="*" >****
</action>
</package> -
拦截器代码:
-
1 @SuppressWarnings("serial") 2 public class AuthInterceptor extends MethodFilterInterceptor { 3 4 @SuppressWarnings("unchecked") 5 @Override 6 protected String doIntercept(ActionInvocation invocation) throws Exception { 7 String url = invocation.getProxy().getActionName().trim() + "!" 8 + invocation.getProxy().getMethod().trim(); 9 10 Map map = invocation.getInvocationContext().getSession(); 11 12 User_info user = (User_info) map.get("user"); 13 14 boolean i = false; 15 Set<Role> roles = user.getRoles(); 16 if (roles == null || roles.size() == 0) { // 无角色不能访问 17 18 return "noAuth"; 19 } 20 21 for (Role role : roles) { 22 23 for (Auth auth : role.getAuths()) { 24 if (url.equals(auth.getUrl())) { 25 i = true; 26 break; 27 } 28 } 29 if (i == true) { 30 break; 31 } 32 33 } 34 35 if (i) { 36 return invocation.invoke(); 37 } else { 38 return "noAuth"; 39 } 40 41 } 42 43 }
-
- 权限列表:
- 权限可以是一个菜单(当权限的url和菜单的url相同时即为菜单权限)