日期:2014-05-18  浏览次数:20723 次

关于基于RBAC的用户权限管理的相关问题
本帖最后由 Javainging 于 2014-04-08 21:03:14 编辑
关于基于RBAC的用户权限管理的相关问题

1、用户-角色-资源,还有两个关联表

用户登陆的时候,把用户信息和用户有权限的资源信息存放在session里面


2、在过滤器里面,对所有的.do结尾的请求进行拦截
如果是登陆、注销等的则不拦截,如下代码所示:

@Override
public void doFilter(ServletRequest req, ServletResponse rsp,
FilterChain chain) throws IOExceptionServletException {
HttpServletRequest request =  (HttpServletRequest) req;

HttpServletResponse response = (HttpServletResponse) rsp;

String uri = request.getRequestURI();
HttpSession session = request.getSession();
Userinfo userInfo =  (Userinfo) session.getAttribute("userInfo");

String urls = null;
String urlss[] = null;
boolean rightFlag = false;//是否有权限访问此资源
if(userInfo!=null){
urls = uri.replaceAll(request.getContextPath(), " ");
urlss = urls.split(";");
rightFlag = this.isAuthorized(urlss[0].split("/")[1], request);
}


//1.登录action不过滤    2.已登录有权限不过滤  3.noRight.do不过滤  4.退出不过滤
if((uri.endsWith("login.do")||uri.endsWith("toLogin.do")||uri.endsWith("noRight.do"))||(userInfo!=null)&&rightFlag){
chain.doFilter(request, response);
}else if(userInfo!=null&&!rightFlag){//用户已登录且无权限
response.sendRedirect("noRight.do");
}else {//跳转到登陆页面

session.setAttribute("loginStatus", "您访问的页面需要登陆,请登陆!");
response.sendRedirect("toLogin.do");
}


}


3、用户无权限的处理
这个权限,无权限不显示,这个很好弄。另一种情况是,用户手动在浏览器输入action地址,所以,我的做法是,
将用户请求的url(toSaveUser.do)和有权限的url(这个是存放在session中的)进行匹配,如果能匹配到,
则代表有权限,如果不能匹配到,则代表无权限。这个我通过rightFlag 可以判断到。


现在的问题是,后台的action太多太多,
比如 用户管理模块,我有  
toSaveUser.do(到添加用户)、saveUser.do(添加用户)、listAllUser.do(列出所有用户)、
viewUserInfor.do(查看个人信息)等等,完成一个添加用户的操作需要几个action来完成。
难道我要一个个的都存到角色关联资源的那张表里面去吗?
特别是很多操作都需要通过action再跳转到页面进行操作。请问有神马比较好的实现方式,谢谢。



------解决方案--------------------
肯定要存到资源表里,如果不存咋判断用户是否有该资源的权限?我现在也在做这个权限,我用的spring的拦截器,拦截方法上标注有相关权限注解的方法的url
------解决方案--------------------
引用:
Quote: 引用:

肯定要存到资源表里,如果不存咋判断用户是否有该资源的权限?我现在也在做这个权限,我用的spring的拦截器,拦截方法上标注有相关权限注解的方法的url



那请问下 怎么在拦截的方法上标注相关权限注解的方法URL呢,
是不是标注了之后,就不拦截了?
谢谢,怎么实现,谢谢。

也要拦截呀?好比有2个方法a和b,a上面有权限注解,就在拦截器里的做相应处理,b没有的话,拦截器直接过去就是了
这是我的一部分代码


public class Authority extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HandlerMethod h = (HandlerMethod)handler;
if(h.getMethod().isAnnotationPresent(AuthorityRequired.class)){
//获取请求的url
String url = request.getRequestURL().toString();
HttpSession session = request.getSess