Springセキュリティ式 - hasRoleの例

Springセキュリティ式– hasRoleの例

1. 概要

Spring Securityは、強力なSpring式言語(SpEL)を使用して、さまざまな式を提供します。 これらのセキュリティ式のほとんどは、コンテキストオブジェクト(the currently authenticated principal)に対して評価されます。

これらの式の評価は、SecurityExpressionRootによって実行されます。これは、Webセキュリティとメソッドレベルのセキュリティの両方の基礎を提供します。

承認メカニズムとしてSpEL式を使用する機能は、Spring Security 3.0で導入され、Spring Security4.xでも継続されています。 Spring Securityの式の包括的なリストについては、this guideを参照してください。

参考文献:

Thymeleafを使用したSpring Security

Spring SecurityとThymeleafを統合するためのクイックガイド

Spring Method Securityの概要

Spring Securityフレームワークを使用したメソッドレベルセキュリティのガイド。

Spring Securityによる2要素認証

Spring Security 4とGoogle Authenticatorモバイルアプリを使用した実用的な2要素認証の実装。

2. Web認証

Spring Securityは、セキュリティルールに基づいてfull page based on the URLを保護することと、parts of a JSP pageを条件付きで表示することの2種類のWeb認証を提供します。

2.1. 全ページ認証の例

http要素に対して式を有効にすると、URLパターンを次のように保護できます。


    
    ...

Java構成の使用:

@Configuration
@EnableWebSecurity
public class SecSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
          .authorizeRequests()
          .antMatchers("/admin/**").hasRole("ADMIN");
    }
    ...
}

Spring Securityは、ロールの前にROLE_を自動的に付けます。

ここでは、hasRole式を使用して、現在認証されているプリンシパルに指定された権限があるかどうかを確認します。

2.2. ページ認証の例

2番目の種類のWeb認証は、セキュリティ式の評価に基づいてJSPページの一部を条件付きで表示します。

pom.xmlSpring Security JSP taglib supportに必要なdependencyを追加しましょう。


    org.springframework.security
    spring-security-taglibs
    5.0.5.RELEASE

security名前空間を使用するには、ページでtaglibサポートを有効にする必要があります。

<%@ taglib prefix="security"
  uri="http://www.springframework.org/security/tags" %>

hasRole式をページで使用できるようになり、ページのレンダリング時に現在認証されているユーザーに基づいてHTML要素を表示/非表示にできます。


    This text is only visible to a user
    
This text is only visible to an admin

3. メソッドレベルの承認の例–@PreAuthorize

セキュリティ式は、アノテーションを使用して、メソッドレベルでビジネス機能を保護するためにも使用できます。

注釈@PreAuthorize@PostAuthorize(および@PreFilter@PostFilter)は、Spring Expression Language(SpEL)をサポートし、式ベースのアクセス制御を提供します。

まず、メソッドレベルのセキュリティを使用するには、@EnableGlobalMethodSecurity:を使用してセキュリティ構成でこれを有効にする必要があります

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

同等のXML構成:

次に、Spring@PreAuthorizeアノテーションを使用してメソッドを保護できます。

@Service
public class FooService {
    @PreAuthorize("hasRole('ROLE_ADMIN')")
    public List findAll() { ... }
    ...
}

これで、ADMINロールを持つプリンシパルのみがfindAllメソッドを正常に呼び出すことができます。

the Pre and Post annotations are evaluated and enforced via proxies – CGLIBプロキシを使用する場合、クラスおよびパブリックメソッドをfinalとして宣言してはならないことに注意してください。

4. 役割のプログラムによるチェック

requestオブジェクトが使用可能な場合、ユーザー権限は、生のJavaコードでプログラムによってチェックすることもできます。

@RequestMapping
public void someControllerMethod(HttpServletRequest request) {
    request.isUserInRole("someAuthority");
}

そしてもちろん、requestにアクセスせずに、現在認証されているユーザーがその特定の権限を持っているかどうかを確認するだけで、手動でチェックを行うこともできます。 さまざまな方法でSpringSecurityコンテキストからのThe user can be obtained

5. 結論

このチュートリアルは、一般的なSpring Security式、特にhasRole式の使用方法の簡単な紹介であり、アプリケーションのさまざまな部分を保護する方法の簡単な紹介です。

Web認証の例については、this Github simple tutorialを確認してください。 メソッドレベルのセキュリティの例もon GitHubです。