多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
让我们考虑一个每个人都熟悉的标准身份验证方案。 1. 提示用户使用用户名和密码登录。 2. 系统(成功)验证用户名的密码是否正确。 3. 获取该用户的上下文信息(他们的角色列表等)。 4. 为用户建立安全上下文 5. 用户继续进行,可能执行一些可能受访问控制机制保护的操作,该访问控制机制针对当前安全上下文信息检查操作所需的许可。 前三项构成了身份验证过程,因此我们将了解这些内容是如何在Spring Security中进行的。 1. 获取用户名和密码并将其组合到`UsernamePasswordAuthenticationToken`(`Authentication`接口的实例,我们之前看到)的实例中。 2. token传递给`AuthenticationManager`的实例以进行验证。 3. `AuthenticationManager`在成功验证后返回完全填充的`Authentication`实例。 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将验证用户名和密码相同的任何用户。 它为每个用户分配一个角色。 上面的输出将是这样的: ~~~ Please enter your username: bob Please enter your password: password Authentication failed: Bad Credentials Please enter your username: bob Please enter your password: bob Successfully authenticated. Security context contains: \ org.springframework.security.authentication.UsernamePasswordAuthenticationToken@441d0230: \ Principal: bob; Password: [PROTECTED]; \ Authenticated: true; Details: null; \ Granted Authorities: ROLE_USER ~~~ 请注意,您通常不需要编写任何类似的代码。 该过程通常在内部进行,例如在Web身份验证过滤器中。 我们刚刚在这里包含了代码,以表明在Spring Security中实际构成身份验证的问题有一个非常简单的答案。 当`SecurityContextHolder`包含完全填充的`Authentication`对象时,用户已进行了身份验证。