Цепочка фильтров становится повторяемой - PullRequest
0 голосов
/ 22 октября 2019

Мне требуется несколько аргументов (имя пользователя и домен) во время аутентификации учетных данных пользователя, для этого я реализую 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()
    }
}
...