身份认证百度百科

身份认证百度百科,第1张

SpringSecurity之身份认证

SpringSecurity可以在不同的认证环境中运行。当我们建议用户使用SpringSecurity进行身份验证,但不建议集成到容器管理的身份验证中时,当您集成到自己的身份验证系统中时,它仍然支持。


1。SpringSecurity中的认证是什么?


现在让我们考虑一下大家都熟悉的标准身份认证场景:


(1)用户打算使用用户名和密码登录系统。


(2)系统验证用户名和密码是否合法。


(3)获取用户的上下文信息(角色等信息)


(4)为用户建立安全上下文。


(5)接下来,用户可以在权限访问机制下执行一些受保护的 *** 作,以检查与当前安全上下文相关的必要权限。


前三步是身份认证的过程,接下来看身份认证的详细过程:


(1)获取用户名和密码后,组合成一个usernamepasswordAuthenticationtoken的实例(前面讨论的认证接口的实例)。


(2)将令牌传递给AuthenticationManager实例进行验证。


(3)验证成功后,AuthenticationManager将返回填充好的认证实例。


(4)通过调用SecurityContextHolder建立安全上下文的实例。GetContext()。SetAuthentication(...)并将其传递给返回的身份验证对象。


以下是用于身份验证的代码片段:


import org.springframework.security.authentication.*; import org.springframework.security.core.*; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.context.SecurityContextHolder; public class AuthenticationExample {   private static AuthenticationManager am = new SampleAuthenticationManager();      public static void main(String[] args) throws Exception {     BufferedReader in = new BufferedReader(new InputStreamReader(System.in));     while(true) {       System.out.println("Please enter your username:");       String name = in.readLine();       System.out.println("Please enter your password:");       String password = in.readLine();       try {         Authentication request = new UsernamePasswordAuthenticationToken(name, password);         Authentication result = am.authenticate(request);         SecurityContextHolder.getContext().setAuthentication(result);         break;       } catch(AuthenticationException e) {         System.out.println("Authentication failed: " + e.getMessage());       }     }     System.out.println("Successfully authenticated. Security context contains: " +               SecurityContextHolder.getContext().getAuthentication());   } } class SampleAuthenticationManager implements AuthenticationManager {   static final List<GrantedAuthority> AUTHORITIES = new ArrayList<GrantedAuthority>();      static {     AUTHORITIES.add(new SimpleGrantedAuthority("ROLE_USER"));   }      public Authentication authenticate(Authentication auth) throws AuthenticationException {     if (auth.getName().equals(auth.getCredentials())) {       return new UsernamePasswordAuthenticationToken(auth.getName(),         auth.getCredentials(), AUTHORITIES);       }       throw new BadCredentialsException("Bad Credentials");   }    }


我们编写了一个小程序,要求用户输入用户名和密码,并执行上述序列。我们实现的AuthenticationManager验证用户名和密码是否一致,并为每个用户分配一个角色。上面的输出与此类似:


请输入您的用户名:

favboy

请输入您的密码:

favccxx

认证失败:错误的凭证

请输入您的用户名:

favboy

请输入您的密码:

favboy

成功认证。安全上下文包含:\

org.springframework.security.authentication.usernamepasswordtauthenticationtoken@441d0230:\

校长:鲍勃;密码:[受保护];\

已验证:真;详细信息:空;\

授予的权限:角色_用户


注意,你通常不需要写任何代码。这个过程通常发生在内部,例如web身份验证过滤器。上面的代码只是告诉我们在SpringSecurity中使用身份验证是多么简单。当SecurityContextHolder包含已填充的身份验证对象时,用户身份就完成了。


2。直接设置SecurityContextHolder的内容


实际上,SpringSecurity并不关心如何将认证对象放在SecurityContextHolder中。唯一的关键是SecurityContextHolder需要有一个身份验证对象,然后用户才能 *** 作经过身份验证的AbstractSecurityInterceptor。


对于那些不是Spring安全的系统,可以编写自己的过滤器或MVC控制器来与认证系统集成。例如,您可以使用容器管理的身份验证系统从ThreadLocal或JNDI获取用户。也许你在一家有遗留认证体系的公司工作,这是企业的“标配”,对此你无能为力。在这种情况下,使用SpringSecurity提供认证是非常容易的。你只需要写一个过滤器来读取第三方的用户信息,然后构建一个Spring安全专用的认证对象,放在AuthenticationContextHolder中。在这种情况下,你需要考虑自己身份认证的基本信息。例如,在响应客户端之前,您需要创建一个HTTP会话会话来缓存请求之间的上下文。


3在Web应用程序中使用身份验证


接下来,让我们探索如何使用SpringSecurity进行身份验证,以及当Web应用程序没有配置web.xml安全策略时,如何建立用户身份验证和安全上下文。


以下是web应用程序认证的过程:


(1)访问一个应用程序的主页并点击一个链接。


(2)向服务器发送请求,服务器判断用户是否正在访问受保护的资源。


(3)因为用户之前没有经过认证,所以服务器发送一个响应(这个响应可能是HTTP响应代码,也可能直接跳转到一个网页)告诉用户,用户必须经过认证。


(4)认证机制决定浏览器是跳转到特定的网页供用户填写表单表单,还是浏览器以某种方式(基本认证对话框、cookie或X.509证书)检索用户的身份。


(5)浏览器将响应(包含表单信息的HTTPPOST请求或包含用户认证细节的HTTP报头)发送回服务器。


(6)接下来,服务器将决定先前的凭证是否有效。如果有效,就进行下一步。否则,浏览器通常会询问是否需要重试。


(7)原始请求将导致重新进行认证过程。重新判断用户有足够的权限访问受保护的资源。如果用户有权限,则请求成功。否则会返回HTTP错误代码403,表示用户没有 *** 作权限。


安全有特定的类负责以上步骤。主要的类是ExceptionTranslationFilter、AuthenticationEntryPoint和调用AuenticationManager的“身份验证机制”。


3.1ExceptionTranslationFilter


顾名思义,ExceptionTranslationFilter是一个在SpringSecurity中处理异常的过滤器,这些异常是由AbstractSecurityInterceptor抛出的,它提供认证服务。


3.2认证输入点


上面第3步中的 *** 作由AuthenticationEntryPoint负责。可以想象,每个web应用程序都有一个默认的身份验证测试,每个主要的身份验证系统都有一个AuthenticationEntrypoint实现,通常执行步骤3中描述的 *** 作之一。


3.3认证机制


一旦您的浏览器提交了身份验证证书(HTTPformPOST或HTTPheader),它就需要在服务器上保存这个权限信息。但是现在转到上面的第6步。在SpringSecurity中,我们对手机认证信息的 *** 作有一个特定的名称。从用户代理(通常是浏览器),称之为“认证机制”。例如基于表单的登录或基本身份验证。从用户代理收集身份验证细节后,将构建身份验证请求对象,然后提交给AuthenticationManager。


在身份验证机制收到填充的身份验证对象后,它将认为请求是合法的,将身份验证放入SecurityContextHolder,然后重试原始请求(步骤7)。另一方面,如果AuthenticationManager拒绝请求,身份验证机制将让用户代理重试(步骤2)。


3.4在请求之间保存安全上下文


[/s2/]

根据应用程序类型,需要一个策略来保存用户 *** 作之间的安全上下文。在典型的web应用程序中,用户的登录日志由其会话id决定,服务器缓存主题信息以保持会话会话。在SpringSecurityContext中,在请求之间存储SecurityContextPersistenceFilter的责任落在SecurityContextPersistenceFilter身上。默认情况下,SecurityContextPersistenceFilter将在HTTP请求中的HttpSession属性上存储上下文。每个请求的上下文都存储在SecurityContextHolder上,最重要的是,当请求完成时,它会清除SecurityContextHolder。为了安全起见,用户不要直接 *** 作HttpSession。这里有一个实现它的简单方法——改用SecurityContextHolder。


许多其他类型的应用程序(如无状态RESTWeb服务)不会使用HTTP会话,并且每次请求时都会重新验证。但是在请求链中包含SecurityContextPersistenceFilter还是很重要的,这样才能保证每次请求后SecurityContextHolder都会被清除空。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/783791.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-04
下一篇 2022-05-04

发表评论

登录后才能评论

评论列表(0条)

保存