クラウド プラットフォームで JavaEE Web サイトを実行しています。ここで、2 種類の認証を使用します。
- プラットフォームにうまく統合され、非常にうまく機能するSSOシステムからのものです。
- 問題のある部分です。1) からユーザーをセッション中に承認し、より制限されたリソースへのアクセスを許可したいと考えています。
いくつかの詳細
- 1) からユーザーとそのデータを取得します。
- ユーザーは最初に 2) へのアクセス許可を要求する必要がありますが、これは拒否または許可することができます。ユーザーは、サーブレットの範囲外にあるサービスから承認を取得します。
- この目的のために、User-POJO (このユーザーのセッションをメンバーとして) をサービスに渡します。
サービスがこのユーザーに権限を付与すると、ユーザー セッションに属性が設定されます。
userSession.setAttribute("auth", "granted");
そのリソースへのアクセスを制限するには、フィルターを使用します。
@WebFilter("/supersecret/*")
public class NiceFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
HttpSession session = req.getSession();
// check
if (session.getAttribute("auth") != "granted")
// redirect to login
else
chain.doFilter(req, res);
}
//...
これは現在機能していますが、私のソリューションは非常にずさんだと感じています。
- サーブレットの範囲外でユーザー セッションを変更することは、悪い習慣のようです。
- セキュリティ目的でセッションに属性を追加することは、おそらく良い考えではありませんか?
標準の JavaEE メカニズムを使用したいのですが、それらのほとんどは、web.xml でlogin-configを宣言するなど、auth-method 1) に既に使用されています。
この問題に対するより堅牢な解決策のアイデアはありますか?
前もって感謝します :)