gpt4 book ai didi

spring-mvc - 如何在Spring Security 3中实现自定义身份验证?

转载 作者:行者123 更新时间:2023-12-02 23:28:15 26 4
gpt4 key购买 nike

我知道这个问题已经被回答过很多次了,但我很困惑。我的应用程序中已经有一个身份验证机制,我只想使用 Spring MVC 的授权部分。我正在使用 Spring MVC 3 和 Spring Security 3。

当我在互联网上搜索时,我发现了两种解决方案,第一个是仅实现 AuthenticationProvider 接口(interface)。 Example1 。第二个是实现UserDetails和UserDetailsS​​ervice,Example2所以我在这里迷路了。

----更新----

问题的第二部分是here 。以及解决方法。

最佳答案

在大多数情况下,当仅使用用户名和密码进行身份验证并使用角色进行授权时,实现您自己的 UserDetailsS​​ervice 就足够了。

用户名密码认证的流程大致如下:

  • Spring 安全过滤器(基本身份验证/表单/..)获取用户名和密码,将其转换为 UsernamePasswordAuthentication 对象并将其传递给 AuthenticationManager
  • 身份验证管理器寻找可以处理 UsernamePasswordtokens 的候选提供程序(在本例中为 DaoAuthenticationProvider),并传递 token 以进行身份​​验证
  • 身份验证提供程序调用 loadUserByUsername 接口(interface)方法,如果用户不存在,则抛出 UsernameNotFound 异常,或者返回包含用户名、密码和权限的 UserDetails 对象。
  • 然后,身份验证提供程序会比较所提供的 UsernamePasswordToken 和 UserDetails 对象的密码。 (它还可以通过密码编码器处理密码哈希)如果不匹配,则身份验证失败。如果匹配,则注册用户详细信息对象并将其传递给 AccessDecisionManager,后者执行授权部分。

那么 DaoAuthenticationProvider 中的验证是否满足您的需求。然后,您只需实现自己的 UserDetailsS​​ervice 并调整 DaoAuthenticationProvider 的验证。

使用spring 3.1的UserDetailsS​​ervice示例如下:

Spring XML:

<security:authentication-manager>
<security:authentication-provider user-service-ref="myUserDetailsService" />
</security:authentication-manager>

<bean name="myUserDetailsService" class="x.y.MyUserDetailsService" />

UserDetailsS​​ervice 实现:

public MyUserDetailsService implements UserDetailsService {

public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
//Retrieve the user from wherever you store it, e.g. a database
MyUserClass user = ...;
if (user == null) {
throw new UsernameNotFoundException("Invalid username/password.");
}
Collection<? extends GrantedAuthority> authorities = AuthorityUtils.createAuthorityList("Role1","role2","role3");
return new User(user.getUsername(), user.getPassword(), authorities);
}

}

关于spring-mvc - 如何在Spring Security 3中实现自定义身份验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18220556/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com