44

Spring Security ログイン ページからデータベース名をリクエスト入力パラメータとして設定しようとしています。現在、 spring security を使用して取得されたユーザー名のみを取得していますSecurityContextHolder.getContext().getAuthentication()

ログインページに設定されている追加フィールドにアクセスするにはどうすればよいですか?

4

8 に答える 8

47

これを行うにはいくつかの方法がありますが、それを行う公式の方法は、Spring のおよびをそれぞれサブクラス化したカスタムAuthenticationDetailsおよびを使用することです。カスタムに追加のフィールドを追加し、カスタムにリクエストからデータを取得させてフィールドに入力します。AuthenticationDetailsSourceWebAuthenticationDetailsWebAuthenticationDetailsSourceWebAuthenticationDetailsWebAuthenticationDetailsSource

Spring Security 3.1 では、要素のauthentication-details-source-ref属性を使用して簡単に構成できます。<form-login>

3.0 では、 を使用する必要がありますBeanPostProcessor。Spring Security FAQ には、BeanPostProcessor を使用してカスタム WebAuthenticationDetailsS​​ource を構成する例があります。

これが完了したら、 SecurityContextHolder.getContext().getAuthentication().getDetails() を呼び出して、追加のフィールドにアクセスできます。

于 2012-04-09T19:33:27.463 に答える
27

@Vacuumのコメントを詳しく説明する

これが簡単な方法です(テストされていませんが、これでうまくいくと思います)

  1. 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); 
    } 
}
  1. UserDetailsService実装では、次の実装を変更します。
UserDetails loadUserByUsername(String username) throws UsernameNotFoundException, DataAccessException;

手順1)のフィルターが使用可能にするセッション変数を取得します。

  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

于 2012-04-09T18:14:20.107 に答える
23

sourcedelicaの使用AuthenticationDetailsSourceとカスタムについて言及されていますAuthenticationDetails。ここに例があります。

authentication-details-source-refBean 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 */ }
}
于 2014-05-31T10:13:38.390 に答える
5

@ 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)
                ...
    }
}
于 2016-06-30T12:11:53.253 に答える
3

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");
    
于 2016-07-22T14:46:29.953 に答える