- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 DaoAuthenticationProvider 进行身份验证,但是当我提交表单时,loadUserByUsername 被 super.authenticate(authentication) 调用了两次,最初它抛出 BadCredentialsException,然后下次成功登录
如果我不使用 passwordencoder,这个过程工作正常,但是当我使用它时,loadUserByUsername 方法被调用了两次。
下面是我的代码:
安全配置
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
@Qualifier("authenticationProvider")
AuthenticationProvider authenticationProvider;
@Autowired
@Qualifier("userDetailsService")
UserDetailsService userDetailsService;
@Bean
public PasswordEncoder passwordEncoder() {
PasswordEncoder encoder = new BCryptPasswordEncoder();
return encoder;
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth)
throws Exception {
auth.authenticationProvider(authenticationProvider)
.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().antMatchers("/admin/**")
.access("hasRole('ROLE_ADMIN')").and().formLogin()
.loginPage("/login").failureUrl("/login?error")
.usernameParameter("username").passwordParameter("password")
.and().logout().logoutSuccessUrl("/login?logout").and().csrf()
.and().exceptionHandling().accessDeniedPage("/403");
}
}
认证类
@Component("authenticationProvider")
public class LimitLoginAuthenticationProvider extends DaoAuthenticationProvider {
@Autowired
@Qualifier("userDetailsService")
@Override
public void setUserDetailsService(UserDetailsService userDetailsService) {
super.setUserDetailsService(userDetailsService);
}
@Override
public Authentication authenticate(Authentication authentication)
throws AuthenticationException {
try {
System.out.println("inside authenticate");
Authentication auth = super.authenticate(authentication);
return auth;
} catch (BadCredentialsException be) {
System.out.println("First call comes here ");
throw be;
} catch (LockedException e) {
throw e;
}
}
}
MyUserdetailsService 类实现 UserDetailsService
@Service("userDetailsService")
public class MyUserDetailsService implements UserDetailsService {
@Autowired
private UserDao userDao;
/* below method is called twice if I am using passwordencoder,
initially authentication fails and then again immediately
on second call authentication succeed */
@Transactional(readOnly=true)
@Override
public UserDetails loadUserByUsername(final String username) throws UsernameNotFoundException {
com.mkyong.users.model.User user = userDao.findByUserName(username);
List<GrantedAuthority> authorities = buildUserAuthority(user.getUserRole());
return buildUserForAuthentication(user, authorities);
}
private User buildUserForAuthentication(com.mkyong.users.model.User user, List<GrantedAuthority> authorities) {
MyUserDetails myUserDetails = new MyUserDetails (user.getUsername(), user.getPassword(), user.isEnabled(), user.isAccountNonExpired(), user.isAccountNonLocked(), user.isCredentialsNonExpired(), user.getEmailId(),authorities);
return myUserDetails;
}
private List<GrantedAuthority> buildUserAuthority(Set<UserRole> userRoles) {
Set<GrantedAuthority> setAuths = new HashSet<GrantedAuthority>();
// Build user's authorities
for (UserRole userRole : userRoles) {
setAuths.add(new SimpleGrantedAuthority(userRole.getRole()));
}
List<GrantedAuthority> Result = new ArrayList<GrantedAuthority>(setAuths);
return Result;
}
}
有人能帮帮我吗?我相信 SecurityConfig 类需要进行一些更改,但我无法弄清楚具体位置。
最佳答案
在 java_dude 和 SergeBallesta 的帮助下,我终于得到了查询的解决方案。
经过大量调试后,我发现当在 DaoAuthenticationProvider 类中调用 isPasswordValid 方法而不是调用方法 1 时,它是从 org.springframework.security 调用方法 2 .authentication.encoding.PlaintextPasswordEncoder 哪个被折旧了,在第二次调用时它调用了正确的 isPasswordValid方法一。
方法一
public boolean isPasswordValid(String encPass, String rawPass, Object salt) {
checkSalt(salt);
return delegate.matches(rawPass, encPass);
}
方法二
public boolean isPasswordValid(String encPass, String rawPass, Object salt) {
String pass1 = encPass + "";
// Strict delimiters is false because pass2 never persisted anywhere
// and we want to avoid unnecessary exceptions as a result (the
// authentication will fail as the encodePassword never allows them)
String pass2 = mergePasswordAndSalt(rawPass, salt, false);
if (ignorePasswordCase) {
// Note: per String javadoc to get correct results for Locale insensitive, use English
pass1 = pass1.toLowerCase(Locale.ENGLISH);
pass2 = pass2.toLowerCase(Locale.ENGLISH);
}
return PasswordEncoderUtils.equals(pass1,pass2);
}
要正确地进行身份验证,除了我当前的相关代码之外,只需在您的 SecurityConfig 类中添加以下代码。
@Bean
public DaoAuthenticationProvider authProvider() {
// LimitLoginAuthenticationProvider is my own class which extends DaoAuthenticationProvider
final DaoAuthenticationProvider authProvider = new LimitLoginAuthenticationProvider();
authProvider.setUserDetailsService(userDetailsService);
authProvider.setPasswordEncoder(passwordEncoder());
return authProvider;
}
** 并更改此方法代码**
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(authProvider())
.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
}
关于java - loadUserByUsername 使用 DaoAuthenticationProvider 执行两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30707680/
我正在 Java EE 应用程序(Spring/Struts/Hibernate)中实现 spring Security。我的自定义 DaoAuthenticationProvider 有点问题。 @
Spring Boot、Security OAuth2 实现、默认 token 端点 (/oauht/token) 工作正常。但是,当我向位于/oauth/http/token 的新端点发送请求时,由
我正在与苹果最近在 OS X 中遇到的一个“错误”作斗争:) 一个应用程序对用户进行身份验证,不仅将其密码字段视为 bcrypt 哈希值,而且还视为明文,因此它允许特殊的实用程序帐户进行登录使用空密码
我似乎陷入了困境,无法弄清楚发生了什么。我目前正在尝试将用户从使用 Sha-256 加密迁移到使用 Spring 安全性的 Bcyrpt。我看过this answer并已准备好该类,但是我在 Tomc
我正在使用 DaoAuthenticationProvider 进行身份验证,但是当我提交表单时,loadUserByUsername 被 super.authenticate(authenticat
我对 Spring Oauth 和 Spring Security 还是很陌生。我正在尝试在我的项目中使用 client_credentials 流程。现在我设法使用我自己的 CustomDetail
我正在项目中实现Spring Security。几个小时以来我陷入了僵局。 我收到此错误 Error creating bean with name 'org.springframework.secu
我在使用 Spring Security 时遇到了这个问题。 我有一个带有 SecurityConfig 类的 java-config 实现,它扩展了 WebSecurityConfigurerAda
我正在尝试在登录过程中添加用户 IP 验证。如果用户的 IP 地址不在数据库中,应用程序应拒绝身份验证。 问题:根据下面的设置,结果表明 auth.authenticationProvider() 并
我想知道我在这里做错了什么来验证用户。我有一个应用程序,用户通过几个步骤来激活他们的帐户,这样做后我想绕过登录表单并将他们直接带到他们的仪表板。 这是我的自动登录功能的样子: protected vo
我需要从 Spring 安全性中的 DaoAuthenticationProvider 访问 HttpServletRequest 对象。 安全组件扩展了DaoAuthenticationProvid
我对 SonataBundle 有疑问。我有错误“Catchable Fatal Error: Argument 1 passed to Symfony\Component\Security\Core
我是一名优秀的程序员,十分优秀!