spring security3 页面权限标签问题
<%@taglib prefix="sec" uri="http://www.springframework.org/security/tags"%>
-
-
<sec:authorize
ifAllGranted="ROLE_ADMIN,ROLE_USER"> -
admin and user -
</sec:authorize>
-
-
<sec:authorize
ifAnyGranted="ROLE_ADMIN,ROLE_USER"> -
admin or user -
</sec:authorize>
-
-
<sec:authorize
ifNotGranted="ROLE_ADMIN"> -
not admin -
</sec:authorize>
-
-
ifAllGranted,只有当前用户同时拥有ROLE_ADMIN和ROLE_USER两个权限时,才能显示标签内部内容。
-
ifAnyGranted,如果当前用户拥有ROLE_ADMIN或ROLE_USER其中一个权限时,就能显示标签内部内容。
-
ifNotGranted,如果当前用户没有ROLE_ADMIN时,才能显示标签内部内容。
-
-
<sec:accesscontrollist
domainObject="${item}" hasPermission="8,16"> -
<a href="message.do?action=remove&id=${item.id}">Remove</a> -
</sec:accesscontrollist>
-
-
我们将当前显示的对象作为参数传入acl标签,然后指定判断的权限为8(删除)和16(管理),当前用户如果拥有对这个对象的删除和管理权限时,就会显示对应的remove超链接,用户才可以通过此链接对这条记录进行删除操作。
-
-
在spring security3中提供了标签控制权限的解决方案,比如<sec:authorize url="/admin.jsp"> 如果登录用户不具有admin.jsp的访问权限,那么他将无法访问此标签体里的内容。
所以找了下源码看到需要一个DefaultWebInvocationPrivilegeEvaluator决策器实例,直接配置一个实例然后注入FilterSecurityInterceptor的实例即可
- <!-- 页面标签权限功能依赖 -->
- <bean id="webInvocationFilter"
- class="org.springframework.security.web.access.DefaultWebInvocationPrivilegeEvaluator">
- <constructor-arg ref="filterSecurityInterceptor" />
- </bean>
这样我们就可以在页面继续使用security的标签
- <%@ page language="java" pageEncoding="UTF-8"%>
- <%@ taglib prefix='sec' uri='http://www.springframework.org/security/tags' %>
- <%
- String path = request.getContextPath();
- String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
- %>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <base href="<%=basePath%>">
- <title>SPRING SECURITY TEST CENTER</title>
- <meta http-equiv="pragma" content="no-cache">
- <meta http-equiv="cache-control" content="no-cache">
- <meta http-equiv="expires" content="0">
- <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
- <meta http-equiv="description" content="This is my page">
- <!--
- <link rel="stylesheet" type="text/css" href="styles.css">
- -->
- </head>
- <body>
- 用户名:<sec:authentication property="name" />, 欢迎来到主页!<br>
- 拥有权限:<sec:authentication property="principal.authorities" /><br>
- 是否可用:<sec:authentication property="principal.enabled" /><br>
- 未被锁定:<sec:authentication property="principal.accountNonLocked" /><br>
- <sec:authorize ifAnyGranted="ROLE_SUPERVISOR">您是超级管理员,可看到该信息:(这里可以用逗号分隔,加入多个角色你拥有管理员权限)</sec:authorize><br>
- <sec:authorize url='/test.jsp'>你登陆成功了可以看到: <a href="<%=path %>/supervisor/index.jsp">管理页面</a></sec:authorize>
- <br><a href="<%=path %>/logout">注销登录</a>
- </body>
- </html>
-
- 5:完善web页面验证规则
- <http auto-config="true">
- <intercept-url pattern="/js/**" filters="none"/>
- <intercept-url pattern="/css/**" filters="none"/>
- <intercept-url pattern="/images/**" filters="none"/>
- <intercept-url pattern="/a.jsp" access="ROLE_A" />
- <intercept-url pattern="/b.jsp" access="ROLE_B" />
- <intercept-url pattern="/c.jsp" access="ROLE_A, ROLE_B" />
- <intercept-url pattern="/**" access="ROLE_USER" />
- </http>
-
- <http auto-config="true"> <intercept-url pattern="/js/**" filters="none"/> <intercept-url pattern="/css/**" filters="none"/> <intercept-url pattern="/images/**" filters="none"/> <intercept-url pattern="/a.jsp" access="ROLE_A" /> <intercept-url pattern="/b.jsp" access="ROLE_B" /> <intercept-url pattern="/c.jsp" access="ROLE_A, ROLE_B" /> <intercept-url pattern="/**" access="ROLE_USER" /> </http>
- 5:完善web页面验证规则
-
- 6:自定义验证配置
- <!-- 指 定登陆页面、成功页面、失败页面-->
- <form-login login-page="/login.jsp" default-target-url="/index.jsp" authentication-failure-url="/login.jsp" />
- <!-- 尝 试访问没有权限的页面时跳转的页面 -->
- <access-denied-handler error-page="/accessDenied.jsp"/>
- <!-- 使 用记住用户名、密码功能,指定数据源和加密的key -->
- <remember-me data-source-ref="dataSource" />
- <!-- logout 页面,logout后清除session -->
- <logout invalidate-session="true" logout-success-url="/login.jsp" />
- <!-- session 失 效后跳转的页面,最大登陆次数 -->
- <session-management invalid-session-url="/sessionTimeout.htm">
- <concurrency-control max-sessions="1" expired-url="/sessionTimeout.htm" />
- </session-management>
- </http>
- 可 以使用SS自带的登陆页面作为login.jsp的模板
-
- <http auto-config="true"> <!-- 指定登陆页面、成功页面、失败页面--> <form-login login-page="/login.jsp" default-target-url="/index.jsp" authentication-failure-url="/login.jsp" /> <!-- 尝试访问没有权限的页面时跳转的页面 --> <access-denied-handler error-page="/accessDenied.jsp"/> <!-- 使用记住用户名、密码功能,指定数据源和加密的key --> <remember-me data-source-ref="dataSource" /> <!-- logout页面,logout后清除session --> <logout invalidate-session="true" logout-success-url="/login.jsp" /> <!-- session 失效后跳转的页面,最大登陆次数 --> <session-management invalid-session-url="/sessionTimeout.htm"> <concurrency-control max-sessions="1" expired-url="/sessionTimeout.htm" /> </session-management> </http> 可以使用SS自带的登陆页面作为login.jsp的模板
- 6:自定义验证配置
-
- 7:本地化消息输出
拷贝本地化资源文件后,在配置文件中加载该文件:
- <!-- 加 载错误信息资源文件 -->
- <beans:bean id="messageSource"
- class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
- <beans:property name="basename" value="classpath:messages"/>
- </beans:bean>
- 资 源文件在SS核心包:spring-security-core-3.0.2.RELEASE.jar的orgspringframeworksecurity目录 中
-
- <!-- 加载错误信息资源文件 --> <beans:bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> <beans:property name="basename" value="classpath:messages"/> </beans:bean> 资源文件在SS核心包:spring-security-core-3.0.2.RELEASE.jar的orgspringframeworksecurity目录中
- 7:本地化消息输出
-
- 8:在web页面中获取用户信息
- 方式 一:Java代码
- Authentication auth = SecurityContextHolder.getContext().getAuthentication();
- Collection<GrantedAuthority> col = auth.getAuthorities();
- 方 式二:标签库
- <%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>
- <sec:authentication property="name“/>
- <sec:authentication property="authorities“/>
-
- 方式一:Java代码 Authentication auth = SecurityContextHolder.getContext().getAuthentication(); Collection<GrantedAuthority> col = auth.getAuthorities(); 方式二:标签库 <%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %> <sec:authentication property="name“/> <sec:authentication property="authorities“/>
- 8:在web页面中获取用户信息
-
- 9:在web页面进行元素安全控制
- 方式一
- <sec:authorizeifAnyGranted="ROLE_A">
- <a href="a.jsp">你可以访问a.jsp</a>
- </sec:authorize>
- <sec:authorizeifNotGranted="ROLE_A">
- 你 不可以访问a.jsp
- </sec:authorize>
- 方 式二
- <sec:authorizeurl="/a.jsp">
- <a href="a.jsp">你可以访问a.jsp</a>
- </sec:authorize>
-
- 方式一 <sec:authorizeifAnyGranted="ROLE_A"> <a href="a.jsp">你可以访问a.jsp</a> </sec:authorize> <sec:authorizeifNotGranted="ROLE_A"> 你不可以访问a.jsp </sec:authorize> 方式二 <sec:authorizeurl="/a.jsp"> <a href="a.jsp">你可以访问a.jsp</a> </sec:authorize>
- 9:在web页面进行元素安全控制
-
- 10:全局方法安全控制
- <global-method-security pre-post-annotations="enabled">
- <protect-pointcut expression="execution(* com.xasxt.*Service.add*(..))" access="ROLE_A"/>
- <protect-pointcut expression="execution(* com.xasxt.*Service.delete*(..))" access="ROLE_B"/>
- </global-method-security>
- 此 处使用了AspectJ中常用的切入点表达式(百度:AspectJ execution)
-
- <global-method-security pre-post-annotations="enabled"> <protect-pointcut expression="execution(* com.xasxt.*Service.add*(..))" access="ROLE_A"/> <protect-pointcut expression="execution(* com.xasxt.*Service.delete*(..))" access="ROLE_B"/> </global-method-security> 此处使用了AspectJ中常用的切入点表达式(百度:AspectJ execution)
- 10:全局方法安全控制
-
- 11:使用注解进行方法安全控制
- public class DemoService {
- @PreAuthorize("hasRole('ROLE_A')")
- public void methodA() {
- }
- @PreAuthorize("hasAnyRole('ROLE_A, ROLE_B')")
- public void methodB() {
- }
- }
- hasRole 与hasAnyRole为SS通用内置表达式(google : spring security Common Built- In Expressions)
- 11:使用注解进行方法安全控制