ホームページ >Java >&#&チュートリアル >Java API開発における権限制御にApache Taroを使用する

Java API開発における権限制御にApache Taroを使用する

WBOY
WBOYオリジナル
2023-06-17 21:31:40968ブラウズ

Java API 開発における権限制御に Apache Taro を使用する

インターネット技術の発展に伴い、API ベースのアーキテクチャを採用するアプリケーションがますます増えています。このアーキテクチャでは、データまたはサービスは API の形式で外部システムまたはアプリケーションに公開されます。この場合、ユーザーの権限制御が非常に重要になります。この記事では主に、Apache Kiri を使用して Java API の権限の問題を管理する方法を紹介します。

Apachehiro の概要

Apachehiro は、アプリケーションにおけるセキュリティ認証、認可、パスワード管理、セッション管理などの基本機能を提供する、Apache Software Foundation のオープンソース フレームワークです。 Apache Taro は、Java 開発者がセキュリティの問題を心配することなくビジネス ロジックに集中できるようにする、シンプルで使いやすいセキュリティ フレームワークです。

Apache Tora の主なコンポーネントは次のとおりです:

  1. 件名: アプリケーションと対話するユーザーを表します。これには、人、プログラム、サービスなどが含まれます。各サブジェクトには、ユーザーの ID を表すために使用できるセキュリティ関連の「プリンシパル」のセットがあります。
  2. SecurityManager: アプリケーションのセキュリティ操作を管理するために使用されます。その主な役割は、認証、認可、暗号化などです。
  3. レルム: ユーザー、ロール、権限などのアプリケーション データを取得するために使用されます。データはデータベース、ファイルなどに保存される場合があります。
  4. SessionManager: ユーザーごとのセッション情報の作成、無効化、メンテナンスなどを管理します。
  5. セッション: ユーザーのログインステータスなどを含む、各ユーザーのセッション情報を維持します。
  6. 暗号化: 暗号化やハッシュ アルゴリズムなどのセキュリティ サービスを提供します。

Shiro は、上記のコンポーネントに基づいて、Java アプリケーションでセキュリティ モジュールを開発するために使用できる完全なセキュリティ フレームワークを提供します。

権限制御に Apache Taro を使用する

Java API の開発プロセスでは、ユーザーの権限を制御する必要が生じることがよくありますが、Shiro はこの機能を実現するための柔軟かつ合理的なソリューションを提供します。具体的な実装方法は以下で紹介します。

  1. Shiro の依存関係パッケージの紹介

まず、Shiro の関連する依存関係パッケージをプロジェクトに追加する必要があります。たとえば、Maven プロジェクトでは、pom.xml に次のコードを追加できます。

<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-core</artifactId>
    <version>1.5.3</version>
</dependency> 
  1. レルム クラスの定義

Shiro では、レルムはユーザーの定義を担当します。 、ロール、権限、その他の関連データを取得し、Shiro フレームワークと統合します。したがって、Realm クラスの定義は、権限制御の最初のステップです。

以下に示すように、Realm クラスをカスタマイズして、データベースからユーザー関連情報を取得する機能を実現できます。

public class MyRealm extends AuthorizingRealm {
    
    // 根据用户名获取用户即其角色、权限等相关信息
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        // 获取当前用户的身份信息
        String username = (String) principalCollection.getPrimaryPrincipal();
        
        // 从数据库中查询用户及其角色
        User user = userService.loadByUsername(username);
        List<Role> roles = roleService.getRolesByUsername(username);
        
        // 添加角色
        List<String> roleNames = new ArrayList<>();
        for (Role role : roles) {
            roleNames.add(role.getName());
        }
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
        info.addRoles(roleNames);
        
        // 添加权限
        List<String> permissionNames = new ArrayList<>();
        for (Role role : roles) {
            List<Permission> permissions = permissionService.getPermissionsByRoleId(role.getId());
            for (Permission permission : permissions) {
                permissionNames.add(permission.getName());
            }
        }
        info.addStringPermissions(permissionNames);
        
        return info;
    }
    
    // 根据用户名和密码验证用户
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        // 获取用户提交的身份信息
        String username = (String) authenticationToken.getPrincipal();
        String password = new String((char[]) authenticationToken.getCredentials());
        
        // 根据用户名查询用户
        User user = userService.loadByUsername(username);
        if (user == null) {
            throw new UnknownAccountException();
        }
        
        // 验证用户密码
        String encodedPassword = hashService.hash(password, user.getSalt());
        if (!user.getPassword().equals(encodedPassword)) {
            throw new IncorrectCredentialsException();
        }
        
        // 如果验证成功,则返回一个身份信息
        SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(username, password, getName());
        return info;
    }
}

上記のコードでは、次のように提供される AuthorizingRealm 抽象クラスを実装します。 doGetAuthorizationInfo メソッドと doGetAuthenticationInfo メソッドは、ユーザーのロールと権限情報を取得し、ユーザーの ID を確認するために使用されます。これらのメソッドは、UserService、RoleService、PermissionService、およびその他のサービス レイヤーを呼び出して、ユーザー データを取得するためにデータベース内の関連情報をクエリします。

  1. Shiro フィルターの構成

Java API では、Shiro フィルターを構成してリクエストをインターセプトし、ユーザー権限を制御できます。 「Shiro Filter」は、Webアプリケーションの権限フィルタリングやセッション管理などに利用できるサーブレットフィルタです。

Shiro フィルターを構成する場合、Shiro のセキュリティ マネージャー、カスタマイズされた Realm クラス、記述されたログイン ページなどを構成する必要があります。例は次のとおりです。

@Configuration
public class ShiroConfig {

    @Bean
    public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) {
        ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean();
        shiroFilter.setSecurityManager(securityManager);

        // 设置登录URL
        shiroFilter.setLoginUrl("/login");
        // 设置无权访问的URL
        shiroFilter.setUnauthorizedUrl("/unauthorized");
        
        // 配置拦截器规则
        Map<String,String> filterChainDefinitionMap = new LinkedHashMap<>();
        filterChainDefinitionMap.put("/login", "anon");
        filterChainDefinitionMap.put("/logout", "logout");
        filterChainDefinitionMap.put("/home", "authc");
        filterChainDefinitionMap.put("/admin/**", "roles[admin]");
        filterChainDefinitionMap.put("/**", "authc");
        shiroFilter.setFilterChainDefinitionMap(filterChainDefinitionMap);

        return shiroFilter;
    }

    @Bean
    public SecurityManager securityManager(MyRealm myRealm) {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        securityManager.setRealm(myRealm);

        return securityManager;
    }
    
    @Bean
    public MyRealm myRealm(HashService hashService,
                           UserService userService,
                           RoleService roleService,
                           PermissionService permissionService) {
        return new MyRealm(userService, roleService, permissionService, hashService);
    }
    
    @Bean
    public HashService hashService() {
        return new SimpleHashService();
    }
}

上記のコードでは、@Configuration アノテーションを使用して、Shiro 関連のパラメーターを構成するための ShiroConfig クラスを定義します。このクラスでは、Shiro フィルター、セキュリティ マネージャー、およびカスタム Realm クラスを構成するための shirFilter() メソッド、securityManager() メソッド、および myRealm() メソッドを定義します。対応するメソッドでは、UserService、RoleService、PermissionService、HashService などの依存関係を使用して、依存関係の注入を通じて関連サービスを注入し、アクセス許可の制御とユーザーの検証を実現できます。

  1. Java API で権限制御にhiroを使用する

上記の手順を完了すると、Java APIで権限制御にShiroを使用できるようになります。特定の実装では、Shiro が提供する Subject クラスを使用して現在のユーザーを表すことができます。このクラスの hasRole()、isPermitted() およびその他のメソッドを通じて、ユーザーが特定のロールまたは権限を持っているかどうかを確認できます。以下に例を示します。

@Controller
public class ApiController {

    @RequestMapping("/api/test")
    @ResponseBody
    public String test() {
        Subject currentUser = SecurityUtils.getSubject();
        if (currentUser.hasRole("admin")) {
            return "Hello, admin!";
        } else if (currentUser.isAuthenticated()) {
            return "Hello, user!";
        } else {
            return "Please login first!";
        }
    }
}

上記のコードでは、ApiController クラスを定義し、その中に test() メソッドを定義します。このメソッドでは、まず現在のユーザーの Subject オブジェクトを取得し、hasRole()、isPermitted() などのメソッドを呼び出して権限を判断します。

概要

Java API 開発において、権限制御は非常に重要な問題です。 Apache Taro は、Java 開発者がユーザー認証、認可、パスワード管理、セッション管理、その他の機能を迅速に実装できるようにする、便利で使いやすいセキュリティ フレームワークを提供します。この記事の紹介を通じて、読者の皆様に、Shiro を使用して Java API 開発で権限制御機能を実装する方法を明確に理解していただければ幸いです。

以上がJava API開発における権限制御にApache Taroを使用するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。