0

サーブレット環境で Apache Shiro をカプセル化したいと考えています。MySecurityUtils を作成し、静的メソッドで Shiro SecurityUtils.getSubject を使用したいと考えています。私の質問は、これが静的メソッドで SecurityUtils.getSubject メソッドを使用する正しい方法であるかどうかです。これにより、マルチスレッド サーブレット環境で問題が発生する可能性はありますか?

MySecurityUtils.java

import org.apache.shiro.subject.Subject;
import org.apache.shiro.SecurityUtils;

public class MySecurityUtils {

    public static MyUser getUser() {
        Subject currentUser = SecurityUtils.getSubject();
        MyUser myUser = new MyUser(currentUser);
        ...
    }
}

MyUser.java

public class MyUser {
   // ... constructors
   public boolean isPermitted(..) {subject.isPermitted(...)}
}
4

2 に答える 2

0

なぜこれをやりたいのかわかりませんが、質問のために、これで問題ありません。

Web コンテキストでは、Shiroはリクエストごとに異なるインスタンスをSecurityUtils#getSubject()返します。Subjectサブジェクトがログインしている場合、資格情報は (セッションから) 新しいSubjectインスタンスにコピーされます。MyUserを呼び出すたびに新しいインスタンスを返すことで、ほぼ同じことを行っていますgetUser()

getUser()ただし、同じリクエストで 2 回呼び出すと、別のMyUserインスタンスが取得されることに注意してください。ただし、内部Subjectは同じになります。クラスで委任以外のロジックを実行している場合、問題になる可能性がありますMyUser

于 2013-03-12T14:59:37.127 に答える
0

Sotirios からのフィードバックを受けて、コードを次のように変更しました。

 public class SecurityHelper {
     public static boolean isAuthenticated(){
      Subject currentUser = SecurityUtils.getSubject();
      return currentUser.isAuthenticated();
     }
     public static void checkPermission(String permissionCode){
          Subject currentUser = SecurityUtils.getSubject();
          currentUser.checkPermission(permissionCode);
     }
     public static void checkPermission(String... permissionCodes){
          Subject currentUser = SecurityUtils.getSubject();
          currentUser.checkPermissions(permissionCodes);
     }
     ... and so on

すべてのアプリケーション ロジックをヘルパー クラスにカプセル化します。

于 2013-03-13T08:00:35.400 に答える