Java API 開発における権限制御に Apache Taro を使用する
インターネット技術の発展に伴い、API ベースのアーキテクチャを採用するアプリケーションがますます増えています。このアーキテクチャでは、データまたはサービスは API の形式で外部システムまたはアプリケーションに公開されます。この場合、ユーザーの権限制御が非常に重要になります。この記事では主に、Apache Kiri を使用して Java API の権限の問題を管理する方法を紹介します。
Apachehiro の概要
Apachehiro は、アプリケーションにおけるセキュリティ認証、認可、パスワード管理、セッション管理などの基本機能を提供する、Apache Software Foundation のオープンソース フレームワークです。 Apache Taro は、Java 開発者がセキュリティの問題を心配することなくビジネス ロジックに集中できるようにする、シンプルで使いやすいセキュリティ フレームワークです。
Apache Tora の主なコンポーネントは次のとおりです:
Shiro は、上記のコンポーネントに基づいて、Java アプリケーションでセキュリティ モジュールを開発するために使用できる完全なセキュリティ フレームワークを提供します。
権限制御に Apache Taro を使用する
Java API の開発プロセスでは、ユーザーの権限を制御する必要が生じることがよくありますが、Shiro はこの機能を実現するための柔軟かつ合理的なソリューションを提供します。具体的な実装方法は以下で紹介します。
まず、Shiro の関連する依存関係パッケージをプロジェクトに追加する必要があります。たとえば、Maven プロジェクトでは、pom.xml に次のコードを追加できます。
<dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.5.3</version> </dependency>
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、およびその他のサービス レイヤーを呼び出して、ユーザー データを取得するためにデータベース内の関連情報をクエリします。
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 などの依存関係を使用して、依存関係の注入を通じて関連サービスを注入し、アクセス許可の制御とユーザーの検証を実現できます。
上記の手順を完了すると、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 サイトの他の関連記事を参照してください。