In Spring Security wird standardmäßig die Formularauthentifizierung verwendet, und die Parameternamen lauten "Benutzername" und "Kennwort". Wenn Sie nicht so aufwändig sein müssen, können Sie die Codemenge mithilfe des Standardauthentifizierungsmechanismus reduzieren. In letzter Zeit nimmt die Authentifizierung im JSON-Format jedoch zu, sodass Sie sie mit Spring Security anpassen können Ich habe versucht, verschiedene Dinge herauszufinden.
Die Parameter für diese Authentifizierung sind wie folgt.
Parametername | Inhalt |
---|---|
Mail Adresse | |
password | Passwort |
tenantCode | Mandantencode |
Principal.java
@Getter
@Setter
public class Principal {
private String email;
private String tenantCode;
private String password;
}
LoginUser.java
@Getter
@Setter
public class LoginUser extends org.springframework.security.core.userdetails.User{
private long userId;
private String userName;
//Fügen Sie weitere Eigenschaften hinzu, die Sie behalten möchten
}
CustomAuthenticationFilter.java
public class CustomAuthenticationFilter extends UsernamePasswordAuthenticationFilter {
@Override
public Authentication attemptAuthentication(HttpServletRequest request,
HttpServletResponse response) {
try {
Principal principal = new ObjectMapper().readValue(request.getInputStream(),
Principal.class);
UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(
principal, null);
setDetails(request, authRequest);
return this.getAuthenticationManager().authenticate(authRequest);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@Override
protected void successfulAuthentication(HttpServletRequest req,
HttpServletResponse res,
FilterChain chain,
Authentication auth) {
SecurityContextHolder.getContext().setAuthentication(auth);
}
}
CustomAuthenticationProvider.java
@Configuration
public class CustomAuthenticationProvider implements AuthenticationProvider {
//Benutzerinformations-Repository
@Autowired
UserRepository userRepository;
//Mandanteninformations-Repository
@Autowired
TenantRepository tenantRepository;
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
//Rufen Sie ab, was von der CustomAuthenticationFilter-Klasse übergeben wurde
Principal principal = (Principal) authentication.getPrincipal();
if (principal == null) {
throw new BadCredentialsException("Keine Anmeldeinformationen");
}
//Überprüfung des gültigen Mandantencodes
Tenant tenant = tenantRepository.findByTenantCode(principal.getTenantCode());
if (tenant == null || tenant.getStatus() == 0) {
throw new BadCredentialsException("Der Mieter ist ungültig");
}
//Gültigkeitsprüfung der Benutzer anhand der E-Mail-Adresse und des Mandantencodes
User user = userRepository.findByEmailAndTenantId(principal.getEmail(), tenant.getId());
//Wenn Benutzerinformationen nicht abgerufen werden konnten
if (user == null) {
throw new BadCredentialsException("Benutzer existiert nicht");
}
if (!new BCryptPasswordEncoder().matches(principal.getPassword(), user.getPassword())) {
throw new BadCredentialsException("dein Passwort ist falsch");
}
List<GrantedAuthority> authorityList = new ArrayList<>();
//Berechtigungsverarbeitung
LoginUser loginUser = new LoginUser();
loginUser.setUserId(user.getId());
loginUser.setUserName(user.getUserName());
return new UsernamePasswordAuthenticationToken(loginUser, principal.getPassword(),
authorityList);
}
@Override
public boolean supports(Class<?> authentication) {
return UsernamePasswordAuthenticationToken.class.isAssignableFrom(authentication);
}
}
SecurityConfig.java
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
CustomAuthenticationProvider authenticationProvider;
@Override
protected void configure(HttpSecurity http) throws Exception {
CustomAuthenticationFilter filter = new CustomAuthenticationFilter();
filter.setRequiresAuthenticationRequestMatcher(
new AntPathRequestMatcher("<Anmelde-URL>", "POST"));
filter.setAuthenticationManager(authenticationManagerBean());
http
.csrf()
.disable()
.authorizeRequests()
.antMatchers("<URL, für die keine Authentifizierung erforderlich ist>")
.permitAll()
.anyRequest()
.authenticated()
.and()
.logout()
.logoutRequestMatcher(
new AntPathRequestMatcher("<Abmelde-URL>", "POST"))
.and()
.addFilter(filter);
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(authenticationProvider);
}
}
Recommended Posts