SpringSecurity之SecurityContext和Authentication对象

下面开始讨论几个 Spring Security 里面的核心对象。

  • org.springframework.security.core.context.SecurityContext接口表示的是当前应用的安全上下文。通过此接口可以获取和设置当前的认证对象。
  • org.springframework.security.core.Authentication接口用来表示此认证对象。通过认证对象的方法可以判断当前用户是否已经通过认证,以及获取当前认证用户的相关信息,包括用户名、密码和权限等。

要使用Authentication认证对象,首先需要获取到 SecurityContext 对象。通过 org.springframework.security.core.context.SecurityContextHoldergetContext() 的静态方法 就可以获取。再通过 SecurityContext.getAuthentication()就可以得到Authentication。通过认证对象的 Authentication.getPrincipal() 方法就可以获得当前的认证主体

认证主体通常是 UserDetails 接口的实现,典型的认证过程就是当用户输入了用户名和密码之后,UserDetailsService通过用户名找到对应的 UserDetails 对象,接着比较密码是否匹配。如果不匹配,则返回出错信息;如果匹配的话,说明用户认证成功,就创建一个实现了 Authentication接口的对象,如 org.springframework.security. authentication.UsernamePasswordAuthenticationToken 类的对象。再通过 SecurityContext.setAuthentication() 方法来设置此认证对象。

//获取当前认证用户的用户名
public static String getAuthenticatedUsername() { 
   String username = null; 
   Object principal = SecurityContextHolder.getContext() 
       .getAuthentication().getPrincipal(); 
   if (principal instanceof UserDetails) { 
       username = ((UserDetails) principal).getUsername(); 
   } else { 
       username = principal.toString(); 
   } 
   return username; 
}

默认情况下(Web应用来说),SecurityContextHolder使用 ThreadLocal来保存 SecurityContext对象。因此,SecurityContext对象对于当前线程上所有方法都是可见的。这种实现对于 Web 应用来说是合适的。

不过在有些情况下,如桌面应用,这种实现方式就不适用了。Spring Security 允许开发人员对此进行定制。开发人员只需要实现接口 org.springframework.security.core.context.SecurityContextHolderStrategy并通过 SecurityContextHolder.setStrategyName(String)方法让 Spring Security 使用此实现即可。

另外一种设置方式是使用系统属性。Spring Security 默认提供了另外两种实现方式:

  • SecurityContextHolder.MODE_GLOBAL表示当前应用共享唯一的 SecurityContextHolder;
  • SecurityContextHolder.MODE_INHERITABLETHREADLOCAL表示子线程继承父线程的 SecurityContextHolder。
//使用全局唯一的 SecurityContextHolder的示例。
public void useGlobalSecurityContextHolder() { 
   SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_GLOBAL); 
}
Spring Security AuthenticationSpring Security 框架中的一个关键概念。它提供了身份验证(Authentication)的功能,用于验证用户的身份和凭据。 在 Spring Security 中,身份验证是通过 AuthenticationManager 进行的。AuthenticationManager 是一个接口,定义了身份验证的方法。它通常由 ProviderManager 实现,ProviderManager 可以配置多个 AuthenticationProvider,每个 Provider 都负责特定类型的身份验证。 在进行身份验证时,用户提供的凭据将被封装为一个 Authentication 对象,并传递给 AuthenticationManager 进行验证。AuthenticationManager 将根据配置的 AuthenticationProvider 逐个尝试进行验证,直到找到一个能够成功验证该凭据的 Provider。如果所有 Provider 都无法验证凭据,将抛出相应的异常。 一旦成功验证了用户的凭据,AuthenticationManager 将返回一个经过填充的 Authentication 对象,其中包含有关用户身份的信息和权限。这个经过验证的 Authentication 对象将被存储在 SecurityContext 中,以供后续的授权(Authorization)过程使用。 在 Spring Security 中,我们可以使用不同的凭据进行身份验证,比如用户名/密码、基于令牌的身份验证等。同时,Spring Security 还提供了灵活的配置选项,可以根据需求自定义身份验证的流程和规则。 希望以上内容对你有所帮助!如果还有其他问题,请继续提问。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值