spring security进级篇 V 自定义标签控制显示

上篇提到了,将用户,角色,组,权限存放到数据库中,会遇到UI上spring security 标签失效问题,建议自己定义自定义标签,下面就自定义标签,具体说一下思路;

spring security 登陆时将用户信息存放于session中,在自定义标签中通过pageContext 获取session相关信息,通过相应传人的URL,进行相应的比对就可以判断某些URL是否有访问权限,进而控制是否显示。

下面是一个简单的自定义标签的例子,如果URL为空,则不显示超链接,否则就显示,在现实中这个判断可以和spring security 结合使用:

tag的java类

Java代码   收藏代码
  1. /**  
  2.  *   
  3.  */   
  4. package  org.springsecurity.tag;  
  5.   
  6. import  javax.servlet.jsp.tagext.BodyTagSupport;  
  7.   
  8. /**  
  9.  * @author jgao1  
  10.  *   
  11.  */   
  12. public   class  AuthorizeTag  extends  BodyTagSupport {  
  13.   
  14.     private   static   final   long  serialVersionUID = 1L;  
  15.   
  16.     private  String URL;  
  17.   
  18.     public  String getURL() {  
  19.         return  URL;  
  20.     }  
  21.       
  22.     public   void  setURL(String uRL) {  
  23.         URL = uRL;  
  24.     }  
  25.     @Override   
  26.     public   int  doStartTag() {  
  27.         // 如果URL不空就显示URL,否则就不显   
  28.         if  ( null  != URL && ! "" .equals(URL)) {  
  29.             return  EVAL_BODY_INCLUDE;  
  30.         }  
  31.         return   this .SKIP_BODY;  
  32.     }  
  33. }  

authorize.tld

Xml代码   收藏代码
  1. <? xml   version = "1.0"   encoding = "UTF-8"   ?>   
  2. < taglib   xmlns = "http://java.sun.com/xml/ns/javaee"   
  3.     xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"   
  4.     xsi:schemaLocation ="http://java.sun.com/xml/ns/javaee   
  5.     http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"  
  6.     version = "2.1" >   
  7.     < description >   
  8.     <![CDATA[security Tags]]>   
  9.     </ description >   
  10.     < tlib-version > 1.0 </ tlib-version >   
  11.     < short-name > security </ short-name >   
  12.     < uri > http://www.springsecurity.org/jsp </ uri >   
  13.     < tag >   
  14.         < description >   
  15.         <![CDATA[authorize Tag]]>   
  16.         </ description >   
  17.         < name > authorize </ name >   
  18.         < tag-class >   
  19.             org.springsecurity.tag.AuthorizeTag  
  20.         </ tag-class >   
  21.         < body-content > JSP </ body-content >   
  22.         < attribute >   
  23.             < name > URL </ name >   
  24.             < required > false </ required >   
  25.             < rtexprvalue > true </ rtexprvalue >   
  26.             < type > java.lang.String </ type >   
  27.         </ attribute >   
  28.     </ tag >   
  29. </ taglib >   

  web.xml

Java代码   收藏代码
  1. <?xml version= "1.0"  encoding= "UTF-8" ?>  
  2. <web-app version="2.5"  xmlns= "http://java.sun.com/xml/ns/j2ee"   
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
  4.     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee    
  5.     http://java.sun.com/xml/ns/j2ee/web-app_2_5.xsd">   
  6.     <welcome-file-list>  
  7.         <welcome-file>index.jsp</welcome-file>  
  8.     </welcome-file-list>  
  9.     <taglib>  
  10.         <taglib-uri>http://www.springsecurity.org/jsp</taglib-uri>   
  11.         <taglib-location>/WEB-INF/authorize.tld</taglib-location>  
  12.     </taglib>  
  13. </web-app>  

 index,jsp

Java代码   收藏代码
  1. <%@ page language= "java"  contentType= "text/html; charset=UTF-8"  pageEncoding= "UTF-8" %>  
  2. <%@ taglib uri="http://www.springsecurity.org/jsp"  prefix= "security" %>  
  3. <body>  
  4. <security:authorize URL="qqq" >  
  5.     <a href="admin.jsp" >进入admin页面</a>  
  6. </security:authorize>  
  7.   
  8. <security:authorize URL="" >  
  9.     <a href="admin.jsp" >进入admin页面</a>  
  10. </security:authorize>  
  11. </body>  

 通过测试会发现,

第一个标签显示,第二个标签不显示,目的已达到,另外,自定义标签教程,方便以后查询

您好 请问页面标签
<sec:authorize ifAllGranted="ROLE_USER">可以访问</sec:authorize>
其中角色ROLE_USER 是写死的(硬编码) 系统角色是可以维护的,请问该如何实现?

另一种url-pattern类型的<sec:authorize url="/add*">
经过测试不能用,有BUG spring官方文档上说 在应用程序上下文必须有webapplicationContext实例,才能用 google上查不到 请帮忙解答,非常感谢!

如果你想用它的,他目前就是这个样子的,角色是不能维护的,需要你自己去修改它的代码,

最简单的方法是你自己重新自定义标签,在登陆时把user放到session里面,

在自定义标签中通过pageContext获取到user,查看url是不是在user的权限内了,在就显示,不在就不显示,在如下的方法中做处理

public int doStartTag() { 
        // 如果URL不空就显示URL,否则就不显
        // 现实中通过pagecontex获取session中的user,进而找到它角色对应的资源中有没有和url匹配的,有就显示,没有就不显示

        if (null != URL && !"".equals(URL)) { 
            return EVAL_BODY_INCLUDE; 
        } 
        return this.SKIP_BODY; 
    } 

猜你喜欢

转载自marsvaadin.iteye.com/blog/1736547