欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-26 23:19:15
...

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

 

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

 

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

 

tag的java类

 

Java代码  spring security进级篇 V 自定义标签控制显示
            
    
    博客分类: spring--security securityspring 
  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代码  spring security进级篇 V 自定义标签控制显示
            
    
    博客分类: spring--security securityspring 
  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代码  spring security进级篇 V 自定义标签控制显示
            
    
    博客分类: spring--security securityspring 
  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代码  spring security进级篇 V 自定义标签控制显示
            
    
    博客分类: spring--security securityspring 
  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; 
    } 

相关标签: security spring