Spring Security ログイン ページからデータベース名をリクエスト入力パラメータとして設定しようとしています。現在、 spring security を使用して取得されたユーザー名のみを取得していますSecurityContextHolder.getContext().getAuthentication()
。
ログインページに設定されている追加フィールドにアクセスするにはどうすればよいですか?
Spring Security ログイン ページからデータベース名をリクエスト入力パラメータとして設定しようとしています。現在、 spring security を使用して取得されたユーザー名のみを取得していますSecurityContextHolder.getContext().getAuthentication()
。
ログインページに設定されている追加フィールドにアクセスするにはどうすればよいですか?
これを行うにはいくつかの方法がありますが、それを行う公式の方法は、Spring のおよびをそれぞれサブクラス化したカスタムAuthenticationDetails
およびを使用することです。カスタムに追加のフィールドを追加し、カスタムにリクエストからデータを取得させてフィールドに入力します。AuthenticationDetailsSource
WebAuthenticationDetails
WebAuthenticationDetailsSource
WebAuthenticationDetails
WebAuthenticationDetailsSource
Spring Security 3.1 では、要素のauthentication-details-source-ref
属性を使用して簡単に構成できます。<form-login>
3.0 では、 を使用する必要がありますBeanPostProcessor
。Spring Security FAQ には、BeanPostProcessor を使用してカスタム WebAuthenticationDetailsSource を構成する例があります。
これが完了したら、 SecurityContextHolder.getContext().getAuthentication().getDetails() を呼び出して、追加のフィールドにアクセスできます。
@Vacuumのコメントを詳しく説明する
これが簡単な方法です(テストされていませんが、これでうまくいくと思います)
ExUsernamePasswordAuthenticationFilter
デフォルトのフィルターを拡張する新しいクラスを作成し、追加のパラメーターを取得してセッションに保存します。次のようになります。public class ExUsernamePasswordAuthenticationFilter extends UsernamePasswordAuthenticationFilter {
@Override
public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
final String dbValue = request.getParameter("dbParam");
request.getSession().setAttribute("dbValue", dbValue);
return super.attemptAuthentication(request, response);
}
}
UserDetailsService
実装では、次の実装を変更します。UserDetails loadUserByUsername(String username) throws UsernameNotFoundException, DataAccessException;
手順1)のフィルターが使用可能にするセッション変数を取得します。
<http />
セキュリティ設定で、デフォルトのフィルターをカスタムフィルターで上書きします<custom-filter ref="beanForYourCustomFilterFromStep1" position="FORM_LOGIN_FILTER"/>
カスタムフィルターの詳細については、ドキュメントのこの部分を参照してください:http ://static.springsource.org/spring-security/site/docs/3.1.x/reference/springsecurity-single.html#ns-custom-filters
sourcedelicaの使用AuthenticationDetailsSource
とカスタムについて言及されていますAuthenticationDetails
。ここに例があります。
authentication-details-source-ref
Bean IDcustomWebAuthenticationDetailsSource
を持つ属性を に追加しform-login
ます。
<security:http>
<security:intercept-url pattern="/**" access="..." />
<security:form-login authentication-details-source-ref="customWebAuthenticationDetailsSource" login-page="..." />
<security:logout logout-success-url="..." />
</security:http>
新しいクラスを作成しますCustomWebAuthenticationDetailsSource
:
package security;
import org.springframework.security.authentication.AuthenticationDetailsSource;
import org.springframework.security.web.authentication.WebAuthenticationDetails;
import javax.servlet.http.HttpServletRequest;
public class CustomWebAuthenticationDetailsSource implements AuthenticationDetailsSource<HttpServletRequest, WebAuthenticationDetails> {
@Override
public WebAuthenticationDetails buildDetails(HttpServletRequest context) {
return new CustomWebAuthenticationDetails(context);
}
}
および関連するCustomWebAuthenticationDetails
:
package security;
import org.springframework.security.web.authentication.WebAuthenticationDetails;
import javax.servlet.http.HttpServletRequest;
public class CustomWebAuthenticationDetails extends WebAuthenticationDetails {
private final String yourParameter;
public CustomWebAuthenticationDetails(HttpServletRequest request) {
super(request);
yourParameter = request.getParameter("yourParameter");
}
public String getyourParameter() {
return yourParameter;
}
//TODO override hashCode, equals and toString to include yourParameter
@Override
public int hashCode() { /* collapsed */ }
@Override
public boolean equals(Object obj) { /* collapsed */ }
@Override
public String toString() { /* collapsed */ }
}
@ user1322340 は、loadUserByUsername 関数でセッション属性を取得するための実装の詳細を提供していません。
ステップ 1: @user1322340 が提供するすべてのステップに従います。
ステップ 2: 次のように web.xml に構成を 1 つ追加する必要があります。
<listener>
<listener-class>
org.springframework.web.context.request.RequestContextListener
</listener-class>
</listener>
ステップ 3: このようなコードを使用して属性を取得します。
RequestContextHolder.getRequestAttributes().getAttribute("yourAttributeName", RequestAttributes.SCOPE_SESSION);
ステップ 4: フィルターを spring security config に登録します。「 authenticationManager must be specified 」というエラーが表示された場合。フィルターを構成に登録した後。拡張フィルターに authenticationManagerBean を設定し、そのように構成する必要があります。
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Bean
public ExUsernamePasswordAuthenticationFilter exUsernamePasswordAuthenticationFilter()
throws Exception {
ExUsernamePasswordAuthenticationFilter exUsernamePasswordAuthenticationFilter = new ExUsernamePasswordAuthenticationFilter();
exUsernamePasswordAuthenticationFilter
.setAuthenticationManager(authenticationManagerBean());
return exUsernamePasswordAuthenticationFilter;
}
@Bean
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
@Override
protected void configure(HttpSecurity http) throws Exception {
RequestMatcher requestMatcher = new RequestMatcher() {
@Override
public boolean matches(HttpServletRequest httpServletRequest) {
if (httpServletRequest.getRequestURI().indexOf("/api", 0) >= 0) {
return true;
}
return false;
}
};
http
.addFilterBefore(exUsernamePasswordAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class)
...
}
}
Java 構成を使用する Spring Security 3.0 以降の場合、次の簡単な手順でうまくいきます。
configure の HttpSecurity オブジェクトの UserNameandPasswordAuthenticationFilter の前に of フィルターを追加します。
http.addFilterBefore(new YourFilter(), UsernamePasswordAuthenticationFilter.class);
セッションへのリクエストで必要なフィールドを取得するために、フィルターに次のような行を含めます。
if(requestPath != null &&requestPath.equals("/login") ) {
session.setAttribute("yourParam",req.getParameter("yourParam"));
}
後で、次のように、任意のクラスのセッションからパラメーター値を取得できます。
String yourParam =(String)request.getSession().getAttribute("yourParam");