検索
ホームページJava&#&チュートリアルSpring Boot を使用してセキュリティ認証と認可管理を実装する方法

Spring Boot を使用してセキュリティ認証と認可管理を実装する方法

Jun 22, 2023 pm 12:53 PM
spring boot安全証明書認可管理

インターネットの発展に伴い、アプリケーションのセキュリティが非常に重要になっており、すべてのプログラマーはセキュリティ問題に注意を払う必要があります。 Spring フレームワークは大規模なエンタープライズ レベルのアプリケーションで広く使用されているため、Spring Boot は Web アプリケーションを開発するための非常に一般的な選択肢です。この記事では、Spring Boot を使用してセキュリティ認証と認可管理を実装する方法を学びます。

1. 認証と認可

Spring Boot のセキュリティ認証と認可の実装について説明する前に、認証と認可とは何かを理解する必要があります。

認証とは、エンティティの身元が合法であるかどうかを確認することです。 Webアプリケーションでは通常、ユーザーが正規のユーザーであるかどうかを確認するために行われます。

認可とは、エンティティが合法であることを確認した後、エンティティに特定の操作権限を付与することです。 Web アプリケーションでは、ユーザーが要求されたリソースへの適切なアクセス権を持っているかどうかを確認するのが一般的です。

2. Spring Boot セキュリティ フレームワーク

Spring Boot は、Web アプリケーションのセキュリティ認証と認可管理を簡単に実装できるセキュリティ フレームワークを提供します。 Spring Security は Spring Boot セキュリティ フレームワークの一部です。アプリケーションを安全に実行できるように構成可能なフレームワークを提供します。

#Spring Security は次の機能を提供します:

1. セキュリティの認証と認可

2. HTTPS サポート

3. セッション管理

4. クロスドメインリクエストのサポート

5. メソッドレベルの認可

6. LDAP サポート

7. OpenID サポート

8. OAuth 2.0サポート

3. Spring Boot セキュリティ構成

Spring Boot を使用してセキュリティ認証と認可を実装し始める前に、Spring Boot のセキュリティ構成を理解する必要があります。

Spring Boot は、Java 構成とアノテーションを使用してセキュリティを構成します。セキュリティ構成は、@EnableWebSecurity アノテーションが付けられたクラスで定義されてセキュリティを有効にし、WebSecurityConfigurerAdapter を継承してセキュリティを構成するクラスを定義します。

以下は、基本的な Spring Boot セキュリティ構成の例です:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/admin/**").hasRole("ADMIN")
                .antMatchers("/user/**").hasAnyRole("ADMIN", "USER")
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
            .logout()
                .permitAll();
    }
    
    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth
            .inMemoryAuthentication()
                .withUser("admin").password("admin").roles("ADMIN")
                .and()
                .withUser("user").password("user").roles("USER");
    }
}

上記の構成では、@EnableWebSecurity アノテーションを使用してセキュリティを有効にし、WebSecurityConfigurerAdapter を継承するクラスを定義します。

configure() メソッドは、アプリケーションが HTTP リクエストのセキュリティのルールの設定を開始するときに呼び出されます。この例では、3 つのルールを定義します:

1. /admin/ で始まる URL は、ADMIN のロールを持つユーザーのみにアクセスを許可されます。

2. /user/ で始まる URL には、ADMIN または USER のロールを持つユーザーがアクセスできます。

3. 他のすべてのリクエストには認証が必要です。

formLogin() メソッドはログイン フォームの場所を定義し、すべてのユーザーがログイン フォームにアクセスできるようにします。

logout() メソッドはログアウト機能を設定し、すべてのユーザーにアクセスを許可します。

configureGlobal() メソッドは、ユーザー名とパスワード、割り当てられたロールなどのメモリ内認証スキームを構成します。

これは単なる例であり、さまざまな Spring Security オプションを使用して、より複雑なセキュリティ構成をセットアップできます。

4. 認証プロバイダー

上記の設定例では、メモリ内認証スキームを使用しました。ただし、実際には、通常、ユーザー情報を保存するためにデータベースを使用します。 Spring Security は、認証を処理するための認証プロバイダーを提供します。

Spring Security では、認証プロバイダーは、認証を実行するためにauthenticate() メソッドを実装する必要があるインターフェイスです。認証プロバイダーは、メモリ内、リレーショナル データベース、または LDAP ベースなどにすることができます。

以下はデータベースベースの認証プロバイダーの例です:

@Service
public class UserDetailsServiceImp implements UserDetailsService {
    @Autowired
    private UserRepository userRepository;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        User user = userRepository.findByName(username);
        if (user == null) {
            throw new UsernameNotFoundException("User not found");
        }
        return new org.springframework.security.core.userdetails.User(user.getName(), user.getPassword(),
                AuthorityUtils.createAuthorityList(user.getAuthorities()));
    }
}

上記のコードでは、UserDetailsS​​ervice インターフェイスを実装する UserDetailsS​​erviceImp クラスを定義します。 loadUserByUsername() メソッドは、データベースからユーザー情報をロードし、ユーザー名、パスワード、および認証を含む Spring Security の UserDetails オブジェクトを返します。

5. 認可管理

Spring Boot では、ロールベースの認可管理に Spring Security を使用できます。 Spring Security は、宣言型とプログラム型という 2 つの認可管理方法を提供します。

1. 宣言的

宣言的認可では、@PreAuthorize および @PostAuthorize アノテーションを使用してアクセス制御ルールを設定できます。 @PreAuthorize はメソッドにアクセスする前に満たす必要がある条件を指定するために使用され、@PostAuthorize はメソッドを返す前に満たす必要がある条件を指定するために使用されます。

以下は、宣言ベースの承認管理の例です:

@Service
public class ProductService {
    @PreAuthorize("hasRole('ROLE_ADMIN')")
    public void addProduct() {
        // add product
    }
    
    @PreAuthorize("hasRole('ROLE_USER')")
    @PostAuthorize("returnObject.owner == authentication.name")
    public Product findProductByName(String name) {
        // find product by name
    }
}

上記のコードでは、アクセス制御ルールを設定するために、addProduct() メソッドと findProductByName() メソッドに @PreAuthorize アノテーションを追加しました。 。

addProduct() メソッドでは、ロール ROLE_ADMIN を持つユーザーがこのメソッドにアクセスできるように制限します。

findProductByName() メソッドでは、ロール ROLE_USER を持つユーザーがメソッドにアクセスできるように制限し、@PostAuthorize アノテーションを使用して別のアクセス制御ルールを設定して、返された製品が所有するすべてのユーザーのみが製品を所有できるようにします。ユーザーが認証されたユーザーと同じである場合にのみ返されます。

2. プログラムによる

プログラムによる承認では、Spring Security API を使用してアクセス制御ルールを設定できます。

次に、プログラムによる承認管理の例を示します:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    private UserService userService;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/admin/**").hasRole("ADMIN")
                .antMatchers("/user/**").hasAnyRole("ADMIN", "USER")
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
            .logout()
                .permitAll()
                .and()
            .csrf().disable()
            .exceptionHandling().accessDeniedHandler(accessDeniedHandler());
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userService).passwordEncoder(passwordEncoder());
    }
    
    @Bean
    public AccessDeniedHandler accessDeniedHandler(){
        return new CustomAccessDeniedHandler();
    }
    
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

在上面的代码中,我们定义了一个UserService类来处理用户信息,并在configure()方法中使用了accessDeniedHandler()方法来定制访问被拒绝时的错误信息。

我们还实现了一个CustomAccessDeniedHandler类来自定义访问被拒绝时的响应。

最后,我们使用了PasswordEncoder来编码密码。

六、结论

在本文中,我们了解了如何使用Spring Boot实现安全认证和授权管理。我们已经讨论了Spring Boot安全框架、安全配置、身份验证提供器和授权管理等关键概念。我们还讨论了如何使用声明式和编程式授权管理。通过使用Spring Boot的安全框架,我们可以轻松地为Web应用程序提供安全性,并确保应用程序可以安全地运行。

以上がSpring Boot を使用してセキュリティ認証と認可管理を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
高度なJavaプロジェクト管理、自動化の構築、依存関係の解像度にMavenまたはGradleを使用するにはどうすればよいですか?高度なJavaプロジェクト管理、自動化の構築、依存関係の解像度にMavenまたはGradleを使用するにはどうすればよいですか?Mar 17, 2025 pm 05:46 PM

この記事では、Javaプロジェクト管理、自動化の構築、依存関係の解像度にMavenとGradleを使用して、アプローチと最適化戦略を比較して説明します。

適切なバージョン化と依存関係管理を備えたカスタムJavaライブラリ(JARファイル)を作成および使用するにはどうすればよいですか?適切なバージョン化と依存関係管理を備えたカスタムJavaライブラリ(JARファイル)を作成および使用するにはどうすればよいですか?Mar 17, 2025 pm 05:45 PM

この記事では、MavenやGradleなどのツールを使用して、適切なバージョン化と依存関係管理を使用して、カスタムJavaライブラリ(JARファイル)の作成と使用について説明します。

カフェインやグアバキャッシュなどのライブラリを使用して、Javaアプリケーションにマルチレベルキャッシュを実装するにはどうすればよいですか?カフェインやグアバキャッシュなどのライブラリを使用して、Javaアプリケーションにマルチレベルキャッシュを実装するにはどうすればよいですか?Mar 17, 2025 pm 05:44 PM

この記事では、カフェインとグアバキャッシュを使用してJavaでマルチレベルキャッシュを実装してアプリケーションのパフォーマンスを向上させています。セットアップ、統合、パフォーマンスの利点をカバーし、構成と立ち退きポリシー管理Best Pra

キャッシュや怠zyなロードなどの高度な機能を備えたオブジェクトリレーショナルマッピングにJPA(Java Persistence API)を使用するにはどうすればよいですか?キャッシュや怠zyなロードなどの高度な機能を備えたオブジェクトリレーショナルマッピングにJPA(Java Persistence API)を使用するにはどうすればよいですか?Mar 17, 2025 pm 05:43 PM

この記事では、キャッシュや怠zyなロードなどの高度な機能を備えたオブジェクトリレーショナルマッピングにJPAを使用することについて説明します。潜在的な落とし穴を強調しながら、パフォーマンスを最適化するためのセットアップ、エンティティマッピング、およびベストプラクティスをカバーしています。[159文字]

Javaのクラスロードメカニズムは、さまざまなクラスローダーやその委任モデルを含むどのように機能しますか?Javaのクラスロードメカニズムは、さまざまなクラスローダーやその委任モデルを含むどのように機能しますか?Mar 17, 2025 pm 05:35 PM

Javaのクラスロードには、ブートストラップ、拡張機能、およびアプリケーションクラスローダーを備えた階層システムを使用して、クラスの読み込み、リンク、および初期化が含まれます。親の委任モデルは、コアクラスが最初にロードされ、カスタムクラスのLOAに影響を与えることを保証します

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール