gpt4 book ai didi

java - 处理 Spring Security Authentication Provider 中抛出的 BadCredentialsException

转载 作者:行者123 更新时间:2023-11-30 06:53:06 25 4
gpt4 key购买 nike

我正在使用 Spring-MVC 和 Spring-Security 来开发 Web 应用程序。

我使用带有 AuthenticationProvider 的自定义登录,而 AuthenticationProvider 又使用 UserDetailsS​​ervice 将登录表单中的数据与数据库中的数据进行匹配。

我想在 AuthenticationProvider 中抛出 2 个异常,第一个是当数据库中不存在用户名时,另一个是当密码不同时。

我想做的是在我的网页中显示抛出的异常的错误消息(错误的用户名或错误的密码),但我不知道在哪里使用catch block ,因为登录流程是托管的通过 Spring-Security

身份验证提供程序

@Component
public class CustomAuthenticationProvider implements AuthenticationProvider {
@Autowired
CustomUserDetailsService userDetails;

@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
String username = authentication.getName();
String password = authentication.getCredentials().toString();

Customer customer = userDetails.loadUserByUsername(username);

if(customer == null) {
throw new BadCredentialsException("Wrong username");
}

if(!password.equals(customer.getPassword())) {
throw new BadCredentialsException("Wrong password");
}

List<GrantedAuthority> authorities = new ArrayList<>();
authorities.add(new SimpleGrantedAuthority(customer.getRole()));

return new UsernamePasswordAuthenticationToken(customer, password, authorities);
}

@Override
public boolean supports(Class<?> clazz) {
return clazz.equals(UsernamePasswordAuthenticationToken.class);
}
}

登录页面

[...]
<div class="form">
<h2>Login</h2>
<form th:action="@{/login}" method="POST" th:object="${customer}">
<input type="text" placeholder="Username" name="username" th:field="*{username}"/>
<input type="password" placeholder="Password" name="password" th:field="*{password}"/>
<button type="submit">Login</button>
</form>
</div>
[...]

spring-security.xml

<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-4.0.xsd">

<http pattern="/resources/**" security="none" />

<http auto-config="true" use-expressions="true">
<intercept-url pattern="/user/**" access="hasRole('USER')" />
<form-login authentication-failure-url="/login" login-page="/login"
login-processing-url="/login" default-target-url="/user" />
<logout invalidate-session="true" success-handler-ref="logoutSuccessHandler" />
</http>

<authentication-manager>
<authentication-provider ref="customAuthenticationProvider" />
</authentication-manager>
</beans:beans>

最佳答案

使用 Thymeleaf 时,您可以像这样“捕获”身份验证异常:

<p th:if="${param.error != null and session['SPRING_SECURITY_LAST_EXCEPTION'] != null}"
th:text="${session['SPRING_SECURITY_LAST_EXCEPTION'].message}">
Wrong username or password
</p>

您可能可以使用标准的 DaoAuthenticationProvider 而不是自定义类:

@Bean
public DaoAuthenticationProvider customAuthenticationProvider()
{
DaoAuthenticationProvider provider = new DaoAuthenticationProvider();
provider.setUserDetailsService(userDetailsService);
provider.setHideUserNotFoundExceptions(false);
return provider;
}

注意,一般不建议在认证失败时判断用户名是否存在于系统中。

关于java - 处理 Spring Security Authentication Provider 中抛出的 BadCredentialsException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42367529/

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