这是对上篇博客的补充。
权限管理一般分为两种粒度,即粗粒度和细粒度。
粗粒度:一般使用拦截器机制,为各个 url 连接赋上相应的权限后,没有相应的权限就无法点击这个链接,这种是最安全的方式。
细粒度:细粒度就是将用户没有权限的链接设为对用户不可见,即用户根本就不知道有这项链接。这里以 struts2 的标签为例,struts2 的超链接标签为:<s:a namespace="" action=""></s:a> ,这里要覆盖标签的类,找到标签的类 AnchorTag 类,将该类的全类名复制,在自己的类路径下新建包和类,包名和类名与原类一致,再将原类代码复制过来,这样在解析标签的时候,就会走类路径下的标签类。在这个类中,重写 doEndTag() 方法,加入权限判断的逻辑,即可控制标签的隐藏,如:
@Override
public int doEndTag() throws JspException {
if( 有权限? ){ //有权限,调用父类的doEndTag 方法
return super.doEndTag();
} else { //无权限
return SKIP_BODY;
}
}
有人说,既然细粒度权限控制就可以直接隐藏标签,用户无法点击链接了,不就可以进行权限控制了吗? 为什么还要用粗粒度权限控制呢?这就是刚才说的,粗粒度控制更安全。试想,如果用户知道了你的某个链接的 url 地址,他可以不通过点击链接,而是直接在地址栏输入相应的 url ,就可以进入相应的链接,这种情况无疑是需要避免的,因而加上粗粒度控制,即使告诉你 url 地址,你没有相应权限,仍是无法访问,以保证安全。