Мне требуется несколько аргументов (имя пользователя и домен) во время аутентификации учетных данных пользователя, для этого я реализую CustomFilterClass
, который расширяет UsernamePasswordAuthenticationFilter
(код вставлен ниже), здесь я могу получить несколько параметров, но после цепочки фильтров снованачать. Таким образом, попытка аутентификации снова, а затем она не проходитЯ запутался в том, что мне не хватает. У меня логин выдачи токена реализован в отдельном сервисном файле AuthorisationServerConfig
, здесь JWT
реализован токен аутентификации и авторизации токена. Это должно быть следующим в Аутентификации, но это не происходит.
Переопределение функции successAuthentication дает возможность продолжить цепочку фильтров, используя chain.doFilter(req, res);
, это не работает.
@Component
class SimpleAuthenticationFilter: UsernamePasswordAuthenticationFilter {
constructor() : super()
val SPRING_SECURITY_FORM_DOMAIN_KEY: String = "domain";
@Override
@Autowired
override fun setAuthenticationManager(authenticationManager: AuthenticationManager) {
super.setAuthenticationManager(authenticationManager);
}
@Override
@Throws(AuthenticationException:: class)
override fun attemptAuthentication(request: HttpServletRequest, response: HttpServletResponse): Authentication {
val authRequest: UsernamePasswordAuthenticationToken = getAuthRequest(request)
val a = authRequest.isAuthenticated
setDetails(request, authRequest);
return this.getAuthenticationManager()
.authenticate(authRequest);
}
@Throws(Exception:: class)
fun getAuthRequest(request: HttpServletRequest): UsernamePasswordAuthenticationToken {
var username: String = obtainUsername(request);
var password: String = obtainPassword(request);
var domain: String? = obtainDomain(request);
if(domain == null || domain == "") {
throw InvalidDomainException("Domain field in empty")
}
var usernameDomain: String = String.format("%s%s%s", username.trim(),
",", domain);
return UsernamePasswordAuthenticationToken(usernameDomain, password, null);
}
@Override
override fun successfulAuthentication(req: HttpServletRequest,
res: HttpServletResponse,
chain: FilterChain,
auth: Authentication) {
super.successfulAuthentication(req, res, chain, auth);
chain.doFilter(req, res);
}
fun obtainDomain(request: HttpServletRequest): String? {
return request.getParameter(SPRING_SECURITY_FORM_DOMAIN_KEY);
}
companion object {
val log = LoggerFactory.getLogger(ClientDetailsRepository::class.java)!!
}
}
class AuthorizationServerConfig @Autowired
constructor(private val authenticationManager: AuthenticationManager,
private val customClientDetailsService: CustomClientDetailsService) : AuthorizationServerConfigurerAdapter() {
@Value("\${security.oauth.jwt.signing-key:}")
private val signingKey: String? = null
@Bean
fun accessTokenConverter(): JwtAccessTokenConverter {
val converter = JwtAccessTokenConverter()
converter.setSigningKey(signingKey)
converter.accessTokenConverter = customAccessTokenConverter()
return converter
}
@Bean
fun tokenStore(): TokenStore {
return JwtTokenStore(accessTokenConverter())
}
@Bean
fun customAccessTokenConverter(): DefaultAccessTokenConverter {
return CustomAccessTokenConverter()
}
@Bean
@Primary
fun tokenServices(): DefaultTokenServices {
val defaultTokenServices = DefaultTokenServices()
defaultTokenServices.setTokenStore(tokenStore())
defaultTokenServices.setSupportRefreshToken(true)
return defaultTokenServices
}
@Throws(Exception::class)
override fun configure(configurer: ClientDetailsServiceConfigurer?) {
configurer!!
.withClientDetails(customClientDetailsService)
}
@Throws(Exception::class)
override fun configure(endpoints: AuthorizationServerEndpointsConfigurer?) {
val tokenEnhancerChain = TokenEnhancerChain()
tokenEnhancerChain.setTokenEnhancers(
Arrays.asList(tokenEnhancer(), accessTokenConverter())
)
endpoints!!.tokenStore(tokenStore())
.tokenEnhancer(tokenEnhancerChain)
.pathMapping("/oauth/token", "/api/auth/login")
.authenticationManager(authenticationManager)
.accessTokenConverter(accessTokenConverter())
}
@Bean
fun tokenEnhancer(): TokenEnhancer {
return CustomTokenEnhancer()
}
}