Я настраиваю WebSecurityConfig для конечных точек, принадлежащих конечным точкам GraphQl.
Это мой код:
@Configuration
@EnableWebSecurity
class WebSecurityConfig : WebSecurityConfigurerAdapter() {
override fun configure(http: HttpSecurity) {
http
.httpBasic()
.and()
.authorizeRequests()
.antMatchers("/users?{query}")
/*
the "#" resolves the variable in the path, "{id}" in this case.
the "@" resolves a current bean.
*/
.access("hasRole('USER') and @userSecurity.checkId(authentication, #query)")
.antMatchers("/**").hasRole("ADMIN")
.anyRequest().denyAll()
.and()
.csrf().disable()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.NEVER)
}
@Bean
fun userSecurity() : UserSecurity {
return UserSecurity()
}
}
/**
* Custom check. Not only we need a user authenticated, but we also
* need to make sure that a user can only access his/her data, and not the
* one of the other users
*/
class UserSecurity{
@Autowired
private lateinit var userRepository: UserRepository
fun checkId(authentication: Authentication, query: String) : Boolean{
val current = (authentication.principal as UserDetails).username
print("\n\n\n")
println(query)
return try {
userRepository.findById(current).get().username == current
} catch (e : Exception){
false
}
}
}
Что я пытаюсь сделать, это извлечь запрос GraphQL из URL,и используйте это для проверки правильности запроса.
F.eks.если JonhDoe пытается сделать запрос на данные других пользователей.Мы хотим проверить, совпадает ли пользователь в запросе с пользователем, аутентифицированным при весенней загрузке, и затем разрешить или нет запрос.
Я использую redis в архитектуре микросервиса