spring security进级篇 V 自定义标签控制显示
上篇提到了,将用户,角色,组,权限存放到数据库中,会遇到UI上spring security 标签失效问题,建议自己定义自定义标签,下面就自定义标签,具体说一下思路;
spring security 登陆时将用户信息存放于session中,在自定义标签中通过pageContext 获取session相关信息,通过相应传人的URL,进行相应的比对就可以判断某些URL是否有访问权限,进而控制是否显示。
下面是一个简单的自定义标签的例子,如果URL为空,则不显示超链接,否则就显示,在现实中这个判断可以和spring security 结合使用:
tag的java类
- /**
- *
- */
- package org.springsecurity.tag;
- import javax.servlet.jsp.tagext.BodyTagSupport;
- /**
- * @author jgao1
- *
- */
- public class AuthorizeTag extends BodyTagSupport {
- private static final long serialVersionUID = 1L;
- private String URL;
- public String getURL() {
- return URL;
- }
- public void setURL(String uRL) {
- URL = uRL;
- }
- @Override
- public int doStartTag() {
- // 如果URL不空就显示URL,否则就不显
- if ( null != URL && ! "" .equals(URL)) {
- return EVAL_BODY_INCLUDE;
- }
- return this .SKIP_BODY;
- }
- }
authorize.tld
- <? xml version = "1.0" encoding = "UTF-8" ?>
- < taglib xmlns = "http://java.sun.com/xml/ns/javaee"
- xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation ="http://java.sun.com/xml/ns/javaee
- http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
- version = "2.1" >
- < description >
- <![CDATA[security Tags]]>
- </ description >
- < tlib-version > 1.0 </ tlib-version >
- < short-name > security </ short-name >
- < uri > http://www.springsecurity.org/jsp </ uri >
- < tag >
- < description >
- <![CDATA[authorize Tag]]>
- </ description >
- < name > authorize </ name >
- < tag-class >
- org.springsecurity.tag.AuthorizeTag
- </ tag-class >
- < body-content > JSP </ body-content >
- < attribute >
- < name > URL </ name >
- < required > false </ required >
- < rtexprvalue > true </ rtexprvalue >
- < type > java.lang.String </ type >
- </ attribute >
- </ tag >
- </ taglib >
web.xml
- <?xml version= "1.0" encoding= "UTF-8" ?>
- <web-app version="2.5" xmlns= "http://java.sun.com/xml/ns/j2ee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
- http://java.sun.com/xml/ns/j2ee/web-app_2_5.xsd">
- <welcome-file-list>
- <welcome-file>index.jsp</welcome-file>
- </welcome-file-list>
- <taglib>
- <taglib-uri>http://www.springsecurity.org/jsp</taglib-uri>
- <taglib-location>/WEB-INF/authorize.tld</taglib-location>
- </taglib>
- </web-app>
index,jsp
- <%@ page language= "java" contentType= "text/html; charset=UTF-8" pageEncoding= "UTF-8" %>
- <%@ taglib uri="http://www.springsecurity.org/jsp" prefix= "security" %>
- <body>
- <security:authorize URL="qqq" >
- <a href="admin.jsp" >进入admin页面</a>
- </security:authorize>
- <security:authorize URL="" >
- <a href="admin.jsp" >进入admin页面</a>
- </security:authorize>
- </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;
}