私は shiro (ki, jsecurity) と数日間作業しており、テスト アプリケーションを作成することができました。私はJBossから離れたstruts2で作業しています。数人のハードコーディングされたユーザーで shiro.ini ファイルを作成することができ、それが機能するようになりました。Java 内の API は非常に理解しやすいように思われるため、shiro をアプリケーションに統合して機能させることは、実際の問題ではありませんでした。私の本当の問題は、このセットアップを使用して REALM を Oracle データベースに作成/関連付ける方法に関するドキュメントを見つけることができなかったことです。私はいくつかの例を見つけ、あてもなく自分の状況に適応させようとしました。しかし、私はできませんでした。
USERSテーブルを持つOracleデータベースがあります。これは、ユーザー名、パスワード、およびロールを保持するだけです。接続できれば、現在のログイン/ログオフ アプリにぴったり収まるように思えます。
次の行を web.xml に追加しました
<filter>
<filter-name>ShiroFilter</filter-name>
<filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>ShiroFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
<listener>
<listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class>
</listener>
次に、shiro.ini を WEB-INF に追加しました。
[main]
[users]
bruins = boston, admin, super, worker
rangers = newyork, super, worker
leafs = toronto, worker
[urls]
/authoring/logout = logout
/authoring/** = authc
その後は、loginAction.java 内から Java コードを呼び出すだけでした。
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
SecurityManager securityManager = factory.getInstance();
SecurityUtils.setSecurityManager(securityManager);
Subject currentUser = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken(this.username, this.password);
try {
currentUser.login(token);
Session session = currentUser.getSession();
session.setAttribute("user", this.username);
} catch (UnknownAccountException uae) {
...
} catch (IncorrectCredentialsException iae) {
...
} catch (LockedAccountException lae) {
...
} catch (AuthenticationException ae) {
...
} catch (Exception e) {
...
}
ActionMessages messages = new ActionMessages();
if (currentUser.isAuthenticated()) {
System.out.println("user is authenticated!!!!!");
if (currentUser.hasRole("admin")){
System.out.println(this.username + " can access admin functions");
}
if(currentUser.hasRole("super")){
System.out.println(this.username + " can access supervisor functions");
}
if(currentUser.hasRole("worker")){
System.out.println(this.username + " can only perform worker functions");
}
addActionMessage(getText("success.valid.user", this.username));
return SUCCESS;
} else {
System.out.println("user was not authenticated!!!!!!");
addActionError(getText("error.login"));
return ERROR;
}
全体として、アプリケーションはハードコーディングされたユーザーで動作しています。私の質問は、Oracle データベースに接続するために REALM をセットアップするための最良の方法は何ですか? 私はそれがオンラインでいくつかの異なる方法で行われているのを見てきましたが、それらのいずれも自分のセットアップに適応させることができませんでした.APIに慣れるために、これを進めたいと思っています.
ありがとう - ジョン