カスタムDataSourceのWebApplicationContextからHttpSessionにアクセスする方法はありますか?いくつかの情報をHttpSessionに保存するカスタム認証処理フィルタを実装しました。この情報は、データベース接続を取得するためにデータソースによって使用されます。SpringのカスタムDataSourceからHttpSessionにアクセスするには?
もう1つのオプションは、SecurityContextHolderを使用して、追加の属性を含むようにカスタマイズされた認証トークンを取得することです。私はこれが正しいアプローチであるとは確信していません。
これは私がこれまで持っているものです。
public class CustomDataSource extends DriverManagerDataSource implements ApplicationContextAware {
protected Connection getConnectionFromDriverManager(String url,
Properties props) throws SQLException {
// want to use the web context to get the http session
// Authentication has a getAttribute(String name) method
SecurityContext securityContext = SecurityContextHolder.getContext();
CustomAuthenticationToken authentication = (CustomAuthenticationToken) securityContext.getAuthentication();
Object attribute = authentication.getAttribute("db");
// create a connection object here
Object conn = getConnectionFromAttribute(attribute);
return (Connection)conn;
}
private WebApplicationContext context;
@Override
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
this.context = (WebApplicationContext)applicationContext;
}
}
更新:
私は唯一のユーザ名とパスワードを持っているAUTHINFOと呼ばれる新しいクラスを、定義されました。ユーティリティ・インタフェースの静的な最終的な変数としてのThreadLocalをreated次いで:
public interface WebUtils{
public static final ThreadLocal<AuthInfo> authInfo = new ThreadLocal<AuthInfo>();
}
のThreadLocalの値は、カスタムデータソースに、今フィルタ
AuthInfo info = new AuthInfo();
info.setName(username);
info.setPass(password);
WebAttributes.authInfo.set(info);
のattemptAuthentication方法で設定されている
protected Connection getConnectionFromDriverManager(String url,
Properties props) throws SQLException {
AuthInfo info = WebAttributes.authInfo.get();
Connection conn = getConnFromAuthInfo(info);
return conn;
}
これはSecurityContextHolderとCustomAuthenticationTokenの使用と同じですか?
スコーププロキシ豆を使用しておよそどれでも良いリソースの周りに、
HandlerInterceptor
またはAspectJのでチェックを行うことができますか?また、DataSourceのSecurityContextにアクセスすることは悪い習慣ですか? – suikodian