一、获取登陆用户信息
1、使用Java代码获得,首先要了解几个security中的对象
SecurityContextHolder:我们把当前应用程序的当前安全环境的细节存储到它里边了,SecurityContextHolder使用ThreadLocal存储这些信息,这意味着,安全环境在同一个线程执行的方法一直是有效的。我们把安全主体和系统交互的信息都保存在SecurityContextHolder中了
SecurityContext::Security上下文,是一个接口。
Authentication :也是一个接口。我们把安全主体和系统交互的信息都保存在SecurityContextHolder中了。 Spring Security使用一个Authentication对应来表现这些信息。虽然你通常不需要自己创建一个Authentication对象,直接通过SecurityContextHolder获取上下文对象,然后通过上下文对象(SecurityContext)获取即可。
UserDetails:是一个Spring Security的核心接口。 它代表一个主体(包含于用户相关的信息)。在Authentication接口中有一个方法 Object getPrincipal(); 这个方法返回的是一个安全主题,大多数情况下,这个对象可以强制转换成UserDetails对象,获取到UerDetails对象之后,就可以通过这个对象的getUserName()方法获取当前用户名。
2、使用spring security的标签库
标签库存放在 spring-security-taglibs-XXX.jar中,在jsp页面中使用标签库的时候,首先引入标签库:下面在index.jsp中使用标签库输出登录用户
二、权限控制到页面上的功能按钮,以上面显示的admin的超链接为例,实际中我们往往需要只有具有ROLE_ADMIN权限的用户才能看到这个超链接,
.这个可以使用 标签库可以做到
<body>
这是首页,欢迎<sec:authentication property="name" /> ! <br />
<sec:authorize ifAllGranted="ROLE_ADMIN" >
<a href="admin.jsp">进入admin.jsp页面</a>
</sec:authorize>
</body>
sec:authorize 标签的属性:
A) ifAllGranted:只有当前用户拥有所有指定的权限时,才能显示标签体的内容 (相当于“与” 的关系)
B) ifAnyGranted:当前用户拥有指定的权限中的一个的时候,就能显示标签内部内容(相当于“或”的关系)
C) ifNotGranted:没有指定的权限的时候,显示标签体的内容 (相当于“非”的关系)
也可以写成下面的形式:当前用户如果能访问/admin.jsp,则显示标签体的内容
<sec:authorize url="/admin.jsp" >
<a href="admin.jsp">进入admin.jsp页面</a>
</sec:authorize>