|
@@ -267,6 +267,142 @@ class AuthorizeRequestsDslTests {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ @Test
|
|
|
+ fun `request when user has some allowed roles then responds with OK`() {
|
|
|
+ this.spring.register(HasAnyRoleConfig::class.java).autowire()
|
|
|
+
|
|
|
+ this.mockMvc.get("/") {
|
|
|
+ with(httpBasic("user", "password"))
|
|
|
+ }.andExpect {
|
|
|
+ status { isOk }
|
|
|
+ }
|
|
|
+
|
|
|
+ this.mockMvc.get("/") {
|
|
|
+ with(httpBasic("admin", "password"))
|
|
|
+ }.andExpect {
|
|
|
+ status { isOk }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ fun `request when user does not have any allowed roles then responds with forbidden`() {
|
|
|
+ this.spring.register(HasAnyRoleConfig::class.java).autowire()
|
|
|
+
|
|
|
+ this.mockMvc.get("/") {
|
|
|
+ with(httpBasic("other", "password"))
|
|
|
+ }.andExpect {
|
|
|
+ status { isForbidden }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @EnableWebSecurity
|
|
|
+ @EnableWebMvc
|
|
|
+ open class HasAnyRoleConfig : WebSecurityConfigurerAdapter() {
|
|
|
+ override fun configure(http: HttpSecurity) {
|
|
|
+ http {
|
|
|
+ authorizeRequests {
|
|
|
+ authorize("/**", hasAnyRole("ADMIN", "USER"))
|
|
|
+ }
|
|
|
+ httpBasic { }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @RestController
|
|
|
+ internal class PathController {
|
|
|
+ @GetMapping("/")
|
|
|
+ fun index() {
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Bean
|
|
|
+ override fun userDetailsService(): UserDetailsService {
|
|
|
+ val userDetails = User.withDefaultPasswordEncoder()
|
|
|
+ .username("user")
|
|
|
+ .password("password")
|
|
|
+ .roles("USER")
|
|
|
+ .build()
|
|
|
+ val admin1Details = User.withDefaultPasswordEncoder()
|
|
|
+ .username("admin")
|
|
|
+ .password("password")
|
|
|
+ .roles("ADMIN")
|
|
|
+ .build()
|
|
|
+ val admin2Details = User.withDefaultPasswordEncoder()
|
|
|
+ .username("other")
|
|
|
+ .password("password")
|
|
|
+ .roles("OTHER")
|
|
|
+ .build()
|
|
|
+ return InMemoryUserDetailsManager(userDetails, admin1Details, admin2Details)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ fun `request when user has some allowed authorities then responds with OK`() {
|
|
|
+ this.spring.register(HasAnyAuthorityConfig::class.java).autowire()
|
|
|
+
|
|
|
+ this.mockMvc.get("/") {
|
|
|
+ with(httpBasic("user", "password"))
|
|
|
+ }.andExpect {
|
|
|
+ status { isOk }
|
|
|
+ }
|
|
|
+
|
|
|
+ this.mockMvc.get("/") {
|
|
|
+ with(httpBasic("admin", "password"))
|
|
|
+ }.andExpect {
|
|
|
+ status { isOk }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ fun `request when user does not have any allowed authorities then responds with forbidden`() {
|
|
|
+ this.spring.register(HasAnyAuthorityConfig::class.java).autowire()
|
|
|
+
|
|
|
+ this.mockMvc.get("/") {
|
|
|
+ with(httpBasic("other", "password"))
|
|
|
+ }.andExpect {
|
|
|
+ status { isForbidden }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @EnableWebSecurity
|
|
|
+ @EnableWebMvc
|
|
|
+ open class HasAnyAuthorityConfig : WebSecurityConfigurerAdapter() {
|
|
|
+ override fun configure(http: HttpSecurity) {
|
|
|
+ http {
|
|
|
+ authorizeRequests {
|
|
|
+ authorize("/**", hasAnyAuthority("ROLE_ADMIN", "ROLE_USER"))
|
|
|
+ }
|
|
|
+ httpBasic { }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @RestController
|
|
|
+ internal class PathController {
|
|
|
+ @GetMapping("/")
|
|
|
+ fun index() {
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Bean
|
|
|
+ override fun userDetailsService(): UserDetailsService {
|
|
|
+ val userDetails = User.withDefaultPasswordEncoder()
|
|
|
+ .username("user")
|
|
|
+ .password("password")
|
|
|
+ .authorities("ROLE_USER")
|
|
|
+ .build()
|
|
|
+ val admin1Details = User.withDefaultPasswordEncoder()
|
|
|
+ .username("admin")
|
|
|
+ .password("password")
|
|
|
+ .authorities("ROLE_ADMIN")
|
|
|
+ .build()
|
|
|
+ val admin2Details = User.withDefaultPasswordEncoder()
|
|
|
+ .username("other")
|
|
|
+ .password("password")
|
|
|
+ .authorities("ROLE_OTHER")
|
|
|
+ .build()
|
|
|
+ return InMemoryUserDetailsManager(userDetails, admin1Details, admin2Details)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
@Test
|
|
|
fun `request when secured by mvc with servlet path then responds based on servlet path`() {
|
|
|
this.spring.register(MvcMatcherServletPathConfig::class.java).autowire()
|