Spring Security Expressions 소개

1. 소개

이 튜토리얼에서 우리는 Spring Security Expressions에 초점을 맞출 것입니다.

보다 복잡한 구현 (예 : ACL)을 살펴보기 전에 보안 표현을 확실히 이해하는 것이 중요합니다. 올바르게 사용하면 매우 유연하고 강력 할 수 있기 때문입니다.

이 기사는 Spring Security Expressions – hasRole 예제의 확장입니다.

2. Maven 종속성

Spring Security를 ​​사용하려면 pom.xml 파일 에 다음 섹션을 포함해야 합니다.

  org.springframework.security spring-security-web 5.2.3.RELEASE  

최신 버전은 여기에서 찾을 수 있습니다.

그리고 빠른 메모 –이 종속성은 Spring Security에만 적용됩니다. 전체 웹 애플리케이션을 위해 pring-corespring-context 를 추가하는 것을 잊지 마십시오 .

3. 구성

먼저 Java 구성을 살펴 보겠습니다.

우리는 확장 할 수 있습니다 WebSecurityConfigurerAdapter을 - 우리가 확장 지점이 기본 클래스 이벤트 중 하나에 후크 할 수있는 옵션이 있습니다 그래서 :

@Configuration @EnableAutoConfiguration @EnableWebSecurity @EnableGlobalMethodSecurity(prePostEnabled = true) public class SecurityJavaConfig extends WebSecurityConfigurerAdapter { ... }

물론 XML 구성도 수행 할 수 있습니다.

4. 웹 보안 표현

이제 보안 표현식을 살펴 보겠습니다.

  • hasRole , hasAnyRole
  • hasAuthority , hasAnyAuthority
  • allowAll , denyAll
  • isAnonymous , isRememberMe , isAuthenticated , isFullyAuthenticated
  • 주체 , 인증
  • hasPermission

이제 각각에 대해 자세히 살펴 보겠습니다.

4.1. hasRole, hasAnyRole

이러한 표현식은 애플리케이션의 특정 URL 또는 메소드에 대한 액세스 제어 또는 권한 부여를 정의합니다.

예를 살펴 보겠습니다.

@Override protected void configure(final HttpSecurity http) throws Exception { ... .antMatchers("/auth/admin/*").hasRole("ADMIN") .antMatchers("/auth/*").hasAnyRole("ADMIN","USER") ... } 

이 예에서는 역할 USER 또는 역할 ADMIN으로 로그인 한 사용자로 제한되는 / auth /로 시작하는 모든 링크에 대한 액세스를 지정합니다 . 또한, 액세스 링크로 시작 / 인증 / 관리 / 우리가해야 할 관리 시스템의 역할을.

다음을 작성하여 XML 파일에서 동일한 구성을 얻을 수 있습니다.

4.2. hasAuthority, hasAnyAuthority

역할과 권한은 Spring에서 비슷합니다.

주요 차이점은 역할이 특별한 의미를 갖는다는 것입니다. Spring Security 4부터는 역할 관련 방법에 의해 ' ROLE_ '접두사가 자동으로 추가됩니다 (아직없는 경우).

따라서 hasAuthority ( 'ROLE_ADMIN') 은 ' ROLE_ '접두사가 자동으로 추가 되기 때문에 hasRole ( 'ADMIN') 과 유사합니다 .

그러나 권한 사용에 대한 좋은 점은 ROLE_ 접두사를 전혀 사용할 필요가 없다는 것 입니다.

다음은 특정 권한을 가진 사용자를 정의하는 간단한 예입니다.

@Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication() .withUser("user1").password(encoder().encode("user1Pass")) .authorities("USER") .and().withUser("admin").password(encoder().encode("adminPass")) .authorities("ADMIN"); } 

물론 다음과 같은 권위 표현을 사용할 수 있습니다.

@Override protected void configure(final HttpSecurity http) throws Exception { ... .antMatchers("/auth/admin/*").hasAuthority("ADMIN") .antMatchers("/auth/*").hasAnyAuthority("ADMIN", "USER") ... }

보시다시피-여기서는 역할에 대해 전혀 언급하지 않았습니다. 또한 Spring 5부터 PasswordEncoder 빈이 필요합니다 .

@Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); }

마지막으로-물론 XML 구성을 사용하여 동일한 기능을 수행 할 수 있습니다.


4.3. allowAll, denyAll

이 두 주석도 매우 간단합니다. 우리는 서비스의 일부 URL에 대한 액세스를 허용하거나 액세스를 거부 할 수 있습니다.

예를 살펴 보겠습니다.

... .antMatchers("/*").permitAll() ...

이 구성을 사용하면 모든 사용자 (익명 및 로그인)가 '/'로 시작하는 페이지 (예 : 홈페이지)에 액세스 할 수있는 권한을 부여합니다.

전체 URL 공간에 대한 액세스를 거부 할 수도 있습니다.

... .antMatchers("/*").denyAll() ...

다시 한 번 XML 구성으로 동일한 구성을 수행 할 수 있습니다.

4.4. isAnonymous, isRememberMe, isAuthenticated, isFullyAuthenticated

In this subsection we focus on expressions related to login status of the user. Let's start with user that didn't log in to our page. By specifying following in Java config, we enable all unauthorized users to access our main page:

... .antMatchers("/*").anonymous() ...

The same in XML config:

If we want to secure the website that everybody who uses it will be required to login, we need to use isAuthenticated() method:

... .antMatchers("/*").authenticated() ...

or XML version:

Moreover, we have two additional expressions, isRememberMe() and isFullyAuthenticated(). Through the use of cookies, Spring enables remember-me capabilities so there is no need to log into the system each time. You can read more about Remember Me here.

In order to give the access to users that were logged in only by remember me function, we may use this:

... .antMatchers("/*").rememberMe() ...

or XML version:

Finally, some parts of our services require the user to be authenticated again even if the user is already logged in. For example, user wants to change settings or payment information; it's of course good practice to ask for manual authentication in the more sensitive areas of the system.

In order to do that, we may specify isFullyAuthenticated(), which returns true if the user is not an anonymous or a remember-me user:

... .antMatchers("/*").fullyAuthenticated() ...

or the XML version:

4.5. principal, authentication

These expressions allow accessing the principal object representing the current authorized (or anonymous) user and the current Authentication object from the SecurityContext, respectively.

We can, for example, use principal to load a user's email, avatar, or any other data that is accessible in the logged in user.

And authentication provides information about the full Authentication object, along with its granted authorities.

Both are described in further detail in the following article: Retrieve User Information in Spring Security.

4.6. hasPermission APIs

This expression is documented and intended to bridge between the expression system and Spring Security’s ACL system, allowing us to specify authorization constraints on individual domain objects, based on abstract permissions.

Let's have a look at an example. We have a service that allows cooperative writing articles, with a main editor, deciding which article proposed by other authors should be published.

In order to allow usage of such a service, we may create following methods with access control methods:

@PreAuthorize("hasPermission(#articleId, 'isEditor')") public void acceptArticle(Article article) { … }

Only authorized user can call this method, and also user needs to have permission isEditor in the service.

We also need to remember to explicitly configure a PermissionEvaluator in our application context:

여기서 customInterfaceImplementationPermissionEvaluator 를 구현하는 클래스입니다 .

물론 Java 구성으로도이 작업을 수행 할 수 있습니다.

@Override protected MethodSecurityExpressionHandler expressionHandler() { DefaultMethodSecurityExpressionHandler expressionHandler = new DefaultMethodSecurityExpressionHandler(); expressionHandler.setPermissionEvaluator(new CustomInterfaceImplementation()); return expressionHandler; }

5. 결론

이 튜토리얼은 Spring Security Expressions에 대한 포괄적 인 소개 및 가이드입니다.

여기에 설명 된 모든 예제는 GitHub 프로젝트에서 사용할 수 있습니다.