之前的章节中介绍了在 Java 代码中如何使用 Spring Security 提供的能力。很多情况下,用户可能有权限访问某个页面,但是页面上的某些功能对他来说是不可用的。比如对于同样的员工列表,普通用户只能查看数据,而具有经理角色的用户则可以看到对列表进行修改的链接或是按钮等。Spring Security 提供了一个 JSP 标签库用来方便在 JSP 页面中根据用户的权限来控制页面某些部分的显示和隐藏。使用这个 JSP 标签库很简单,只需要在 JSP 页面上添加声明即可:<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>
。这个标签库包含如下 3 个标签:
authorize
标签:该标签用来判断其中包含的内容是否应该被显示出来。判断的条件可以是某个表达式的求值结果,或是是否能访问某个 URL,分别通过属性access
和url
来指定。如<sec:authorize access="hasRole('ROLE_MANAGER')">
限定内容只有具有经理角色的用户才可见。<sec:authorize url="/manager_portal.do">
限定内容只有能访问 URL/manager_portal.do
的用户才可见。authentication
标签:该标签用来获取当前认证对象(Authentication
)中的内容。如<sec:authentication property="principal.username" />
可以用来获取当前认证用户的用户名。accesscontrollist
标签:该标签的作用与authorize
标签类似,也是判断其中包含的内容是否应该被显示出来。所不同的是它是基于访问控制列表来做判断的。该标签的属性domainObject
表示的是领域对象,而属性hasPermission
表示的是要检查的权限。如<sec:accesscontrollist hasPermission="READ" domainObject="myReport">
限定了其中包含的内容只在对领域对象myReport
有读权限的时候才可见。
值得注意的是,在使用 authorize
标签的时候,需要通过 <sec:http use-expressions="true">
来启用表达式的支持
<form-login login-page="/login.do"
authentication-success-handler-ref="loginSuccessHandler"
authentication-failure-handler-ref="loginFailureHandler"
authentication-failure-url="/login.do?login_error=1"
always-use-default-target="true" default-target-url="/index.do" />
再 自己写个类loginSuccessHandler 实现 AuthenticationSuccessHandler 接口
如示:
- public void onAuthenticationSuccess(HttpServletRequest request,
- HttpServletResponse response, Authentication authentication)
- throws ServletException, IOException {
- //这里填写自己要执行的操作 如用户的登录时间、ip等等。
- }