对于上篇遗留的问题暂时放一放.
第4篇主要内容:
A).自定义访问被拒绝页面
B).SpringSecurity 标签
当我们使用User 登录账户是能成功访问 Index.jsp 使用admin 登录时就被拒绝了,原因是并没有配置admin的访问权限.
在 applicationContext.xml 配置 ,admin就能正常访问 index.jsp .
<security:intercept-url pattern="/**" access="ROLE_USER,ROLE_ADMIN" />
接下来完成这些功能:
1) 系统中除了login.jsp可以直接访问以外,其它的页面都需要权限才能进入
2) index.jsp页面 ROLE_USER 和ROLE_ADMIN都可以访问;
3) admin.jsp页面只有ROLE_ADMIN权限可以访问
1.创建admin.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% 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>My JSP 'index.jsp' starting page</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>I am admin Hhhhhhhh!@@.... </body> </html>
并且在Index.jsp 中 添加 访问 admin.jsp 的超链接.
<a href="admin.jsp">amdin click。please。。</a>
2. applicationContext.xml 配置
- <security:http auto-config="true" > - <!-- login-page 指定登录页面 --> <security:form-login login-page="/login.jsp" /> - <!-- 对于登录页面不进行拦截 至于后面的* 在访问loing.jsp时可能会传入一些参数 --> <security:intercept-url pattern="/login.jsp*" filters="none" /> <!--设置admin.jsp访问权限--> <security:intercept-url pattern="/admin.jsp*" access="ROLE_ADMIN" /> <security:intercept-url pattern="/**" access="ROLE_USER,ROLE_ADMIN" /> </security:http>
现在用User的用户去登录 点击 连接时访问将被拒绝, 使用 admin 这能正常访问. 被拒绝的页面显示不友好.
A)自定义 自定义访问被拒绝页面
1.创建 accessDenied.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% 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>无权访问</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> 您的访问被拒绝了.无权访问该资源. </body> </html>
2.applicationContext.xml 配置
<!-- access-denied-page 指定被拒绝显示的页面 --> <security:http auto-config="true" access-denied-page="/accessDenied.jsp"> - <!-- login-page 指定登录页面 --> <security:form-login login-page="/login.jsp" /> - <!-- 对于登录页面不进行拦截 至于后面的* 在访问loing.jsp时可能会传入一些参数 --> <security:intercept-url pattern="/login.jsp*" filters="none" /> <security:intercept-url pattern="/admin.jsp*" access="ROLE_ADMIN" /> <security:intercept-url pattern="/**" access="ROLE_USER,ROLE_ADMIN" /> </security:http>
现在可以显示自定义拒绝页面了.
B)SpringSecurity 标签
对于上面用户登录时 该用户没有权限访问的内连 我们可以把它隐藏,有权限的才显示出来.那么用到了
SpringSecurity 标签了.
1.index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; %> <!--添加springsecurity标签库的引入的指令--> <%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>首页</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> <!--对当前用户的权限判断是否是ROLE_ADMIN,则显示标签体的内容--> <sec:authorize ifAllGranted="ROLE_ADMIN"> <a href="admin.jsp">amdin click。please。。</a> </sec:authorize> <br /> <!--当前用户如果能访问/admin.jsp,则显示标签体的内容--> <sec:authorize url="/admin.jsp"> <a href="admin.jsp">进入admin.jsp页面</a> </sec:authorize> </body> </html>
sec:authorize 标签的属性:
A) ifAllGranted:只有当前用户拥有所有指定的权限时,才能显示标签体的内容 (相当于“与” 的关系)
B) ifAnyGranted:当前用户拥有指定的权限中的一个的时候,就能显示标签内部内容(相当于“或”的关系)
C) ifNotGranted:没有指定的权限的时候,显示标签体的内容 (相当于“非”的关系)