博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringSecurity:深入浅出(1)
阅读量:5242 次
发布时间:2019-06-14

本文共 3996 字,大约阅读时间需要 13 分钟。

SpringSecurity:深入浅出(1)

SecurityContextHolder

  SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保存在SecurityContextHolder中。

  SecurityContextHolder默认使用ThreadLocal 策略来存储认证信息。看到ThreadLocal 也就意味着,这是一种与线程绑定的策略。Spring Security在用户登录时自动绑定认证信息到当前线程,在用户退出时,自动清除当前线程的认证信息。

获取当前用户信息

  因为身份信息是与线程绑定的,所以可以在程序的任何地方使用静态方法获取用户信息。一个典型的获取当前登录用户的姓名的例子如下所示:

Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();if (principal instanceof UserDetails) {String username = ((UserDetails)principal).getUsername();} else {String username = principal.toString();}

  

  

Authentication

  Authentication在spring security中是最高级别的身份/认证的抽象。由这个顶级接口,我们可以获得用户拥有的权限信息列表、密码、用户信息、认证信息等。

public interface Authentication extends Principal, Serializable {    Collection
getAuthorities(); Object getCredentials(); Object getDetails(); Object getPrincipal(); boolean isAuthenticated(); void setAuthenticated(boolean var1) throws IllegalArgumentException;}  

 

AuthenticationManager

  AuthenticationManager负责对Authentication的认证,它是一个接口,要求子类实现认证方法。

package org.springframework.security.authentication;public interface AuthenticationManager {    Authentication authenticate(Authentication var1) throws AuthenticationException;}

  它最常用的实现类是ProviderManager,ProviderManager内部会维护一个List<AuthenticationProvider>列表,存放多种认证方式。

在默认策略下,只需要通过一个AuthenticationProvider的认证,即可被认为是登录成功。

private List
providers; public Authentication authenticate(Authentication authentication) throws AuthenticationException { Class
toTest = authentication.getClass(); ... Iterator var8 = this.getProviders().iterator(); while(var8.hasNext()) { AuthenticationProvider provider = (AuthenticationProvider)var8.next(); //每个Provider都有一个对Authentication的支持列表 if (provider.supports(toTest)) { if (debug) { logger.debug("Authentication attempt using " + provider.getClass().getName()); } //每个Provider分别提供验证 try { result = provider.authenticate(authentication); if (result != null) { this.copyDetails(authentication, result); break; } } catch (AccountStatusException var13) { this.prepareException(var13, authentication); throw var13; } catch (InternalAuthenticationServiceException var14) { this.prepareException(var14, authentication); throw var14; } catch (AuthenticationException var15) { lastException = var15; } } } if (result == null && this.parent != null) { try { result = parentResult = this.parent.authenticate(authentication); } catch (ProviderNotFoundException var11) { } catch (AuthenticationException var12) { parentException = var12; lastException = var12; } } if (result != null) { if (this.eraseCredentialsAfterAuthentication && result instanceof CredentialsContainer) { ((CredentialsContainer)result).eraseCredentials(); } if (parentResult == null) { this.eventPublisher.publishAuthenticationSuccess(result); } return result; } else { if (lastException == null) { lastException = new ProviderNotFoundException(this.messages.getMessage("ProviderManager.providerNotFound", new Object[]{toTest.getName()}, "No AuthenticationProvider found for {0}")); } if (parentException == null) { this.prepareException((AuthenticationException)lastException, authentication); } throw lastException; } }

 

转载于:https://www.cnblogs.com/MrSaver/p/11356607.html

你可能感兴趣的文章
转:Web 测试的创作与调试技术
查看>>
python学习笔记3-列表
查看>>
程序的静态链接,动态链接和装载 (补充)
查看>>
关于本博客说明
查看>>
线程androidAndroid ConditionVariable的用法
查看>>
FTTB FTTC FTTH FTTO FSA
查看>>
OpenAI Gym
查看>>
stap-prep 需要安装那些内核符号
查看>>
网易杭研后台技术中心的博客 -MYSQL :OOM
查看>>
第二章 数据通信的基础知识 计算机网络笔记 学堂在线 2.1 数据传输系统 2.2 信号...
查看>>
如何解决click事件的重复触发问题
查看>>
2016寒假自学笔记
查看>>
VC++2012编程演练数据结构《21》二叉排序树
查看>>
Easyui NumberBox格式化展示
查看>>
转载:ASP.NET Core 在 JSON 文件中配置依赖注入
查看>>
(描述需要改进) Leetcode No.71 **
查看>>
socket初识
查看>>
绕啊绕的递归函数
查看>>
vue+sass 下sass不能运行问题
查看>>
struts 的应用
查看>>