安全上

我刚刚宣布了新消息学习Spring Security课程,包括完整的材料集中在新的OAuth2堆栈在Spring Security 5:

>>看看这个课程

1.概述

本文将展示如何在Spring Security中检索用户详细信息

目前通过身份验证的用户可以通过Spring中的许多不同机制使用——让我们来介绍最常见的解决方案——编程访问。

进一步阅读:

使用Spring安全跟踪登录用户

在使用Spring Security构建的应用程序中跟踪登录用户的快速指南。

Spring安全性——角色和特权

如何映射Spring Security应用程序的角色和权限:设置、身份验证和注册过程。

弹簧安全-重置您的密码

每个应用程序都应该允许用户修改自己的密码,以防忘记。

2.在Bean中获取用户

检索当前经过身份验证的主体的最简单方法是通过静态调用SecurityContextHolder:

认证认证= securitycontexthholder . getcontext ().getAuthentication();String currentPrincipalName = authentication.getName();

此代码段的一个改进是,在尝试访问用户之前,首先检查是否存在已验证的用户:

认证认证= securitycontexthholder . getcontext ().getAuthentication();如果(!(认证实例的AnonymousAuthenticationToken)) {String currentUserName = authentication. getname ();返回currentUserName;}

当然,使用这样的静态调用也有缺点——降低代码的可测试性是最明显的缺点之一。相反,我们将探索针对这一常见需求的替代解决方案。

3.在控制器中获取用户

在一个@ controller注释bean,还有其他选项。主体可以直接定义为方法参数框架将正确解决:

@Controller public class SecurityController {@RequestMapping(value = "/username", method = RequestMethod.GET) @ResponseBody public String currentUserName(Principal Principal) {return Principal . getname ();}}

另外,我们还可以使用身份验证令牌:

@Controller public class SecurityController {@RequestMapping(value = "/username", method = RequestMethod.GET) @ResponseBody public String currentUserName(Authentication Authentication) {return Authentication . getname ();}}

的API身份验证类是非常开放的,因此框架保持尽可能灵活。由于这个原因,Spring Security主体只能作为对象需要被转换成正确的UserDetails实例:

UserDetails UserDetails = (UserDetails) authentication.getPrincipal();system . out。println("用户有权限:" + userdetails . getauauthorities ());

最后,直接HTTP请求:

@Controller public class GetUserWithHTTPServletRequestController {@RequestMapping(value = "/username", method = RequestMethod.GET) @ResponseBody public String currentUserNameSimple(HttpServletRequest request) {Principal Principal = request. getuserprincipal ();返回principal.getName ();}}

4.通过自定义界面获取用户

充分利用Spring依赖项注入,并能够在任何地方检索身份验证,而不仅仅是在@ controller bean,我们需要将静态访问隐藏在一个简单的facade后面:

公共接口IAuthenticationFacade{认证getAuthentication();} @Component public class AuthenticationFacade implements IAuthenticationFacade {@Override public Authentication getAuthentication() {return securitycontexthholder . getcontext ().getAuthentication();}}

立面暴露了身份验证对象,同时隐藏静态状态并保持代码解耦和完全可测试:

@Controller public class GetUserWithCustomInterfaceController {@Autowired private IAuthenticationFacade authenticationFacade;@RequestMapping(value = "/username", method = RequestMethod.GET) @ResponseBody public String currentUserNameSimple(){认证认证= authenticationFacade.getAuthentication();返回authentication.getName ();}}

5.在JSP中获取用户

当前认证的主体也可以在JSP页面中访问,通过利用spring安全性标签库支持。首先,我们需要在页面中定义标签:

<%@ taglib prefix="security" uri="http://www.springframework.org/security/tags" %>

接下来,我们可以向校长咨询:

<安全:授权访问= " isAuthenticated ()"> authenticated as  < /安全:授权>

6.在Thymeleaf中获得用户

Thymeleaf一个现代的,服务器端web模板引擎,好吗与Spring MVC的集成框架。让我们看看如何使用Thymeleaf引擎访问页面中当前经过身份验证的主体。

首先,我们需要添加thymeleaf-spring5thymeleaf-extras-springsecurity5Thymeleaf与Spring Security的集成依赖:

<依赖> < groupId > org.thymeleaf。     >。thymeleaf < / groupId > < artifactId > thymeleaf-spring5 < / artifactId > < / >的依赖

现在属性在HTML页面中引用主体证监会:授权属性:

  

7.结论

本文介绍了如何在Spring应用程序中获取用户信息,首先介绍常用的静态访问机制,然后介绍几种更好的注入主体的方法。

这些示例的实现可以在GitHub项目-这是一个基于Eclipse的项目,所以它应该很容易导入和运行。当项目在本地运行时,主页HTML可以在以下网址访问:

http://localhost:8080/spring-security-rest-custom/foos/1
安全底

我刚刚宣布了新消息学习Spring Security课程,包括完整的材料集中在新的OAuth2堆栈在Spring Security 5:

>>看看这个课程
10评论
最古老的
最新的
内联反馈
查看所有评论
对这篇文章的评论关闭!