2

私はSpring Frameworkと Spring セキュリティに比較的慣れていません。

カスタム認証スキーム、HTML を使用しました。

<form action="j_spring_security_check">
    <input type="text" name="j_username" value="abc"/>
    <input type="text" name="j_password" value="abc"/>
    <input type="text" name="myCustom1" value="pqr"/> <!-- maybe type="hidden" -->
    <input type="text" name="myCustom2" value="pqr"/> <!-- maybe type="hidden" -->
</form>

および対応するコード:

public class CustomAuthenticationProvider extends AbstractUserDetailsAuthenticationProvider
{
    @Override protected void additionalAuthenticationChecks(UserDetails userDetails, UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken)
    throws AuthenticationException
    {
        System.out.println("Method invoked : additionalAuthenticationChecks isAuthenticated ? :"+usernamePasswordAuthenticationToken.isAuthenticated());
    }

    @Override protected UserDetails retrieveUser(String username,UsernamePasswordAuthenticationToken authentication)
    throws AuthenticationException
    {
        System.out.println("Method invoked : retrieveUser");
        //I have Username,password:
        //HOW CAN I ACCESS "myCustom1", "myCustom2" here ?
    }
}
4

5 に答える 5

2

上記はすべて、優れた完璧なソリューションです。しかし、私は完全にうまく機能する回避策のようなソリューションを使用しました。ThreadLocal に使用されるマルチテナント ID

package com.mypackage.servlet;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

import org.springframework.util.Assert;

public class ThreadLocalContextUtil implements Filter{
     private static final ThreadLocal<Object> contextHolder =
                new ThreadLocal<Object>();

       public static void setTenantId(Object tenantId) {
          Assert.notNull(tenantId, "customerType cannot be null");
          contextHolder.set(tenantId);
       }

       public static Object getTenantId() {
          return contextHolder.get();
       }

       public static void clearTenant() {
          contextHolder.remove();
       }

    public void destroy() {

    }

    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        // Set the tenant Id into a ThreadLocal object
        ThreadLocalContextUtil.setTenantId(request);
        if(chain != null)
            chain.doFilter(request, response);
        else {
            //error
        }
    }

    public void init(FilterConfig filterconfig) throws ServletException {

    }
}

春のセキュリティxml

<security:http auto-config="true" use-expressions="true" access-denied-page="/forms/auth/403" >
    <security:custom-filter before="FIRST" ref="tenantFilter" />
    ......
    </security:http>

認証クラスのアクセス リクエスト オブジェクト

HttpServletRequest currRequest = (HttpServletRequest) ThreadLocalContextUtil.getTenantId();

次に、リクエスト オブジェクトを使用してカスタム パラメータを取得します

于 2013-03-21T08:11:45.843 に答える
1

ここでの秘訣は、UsernameAndPasswordAuthenicationTokenを拡張する新しいAuthenicationToken(おそらく)を作成する必要があることです。@ emillsが言うように、新しいAuthenciationProcessingFilterを実装して、リクエスト値をトークンにマップし、AuthenicationManagerに送信する必要があります。

基本的に、スプリングセキュリティでカスタム認証チェーンを実装するには、いくつかの部分があります。

  • AuthenicationToken-認証リクエストとその結果の詳細、つまり認証に必要な資格情報が含まれている
  • AuthenicationProvider-AuthenicationManagerに登録され、AuthenicationTokenを受け入れてユーザーを検証し、付与された権限が設定されたトークンを返します
  • AuthenciationFilter-AbstractProcessingFilterを使用するだけで、実際にはフィルターである必要はありません。
于 2009-10-27T09:38:18.857 に答える
1

ユーザー名とパスワードを操作するために追加のフォームパラメーターを使用する必要がある場合は、独自のAuthenticationProcessingFilterを実装できます。

http://static.springsource.org/spring-security/site/apidocs/org/springframework/security/ui/webapp/AuthenticationProcessingFilter.html

このクラスは、HttpRequestに完全にアクセスできるため、送信するすべての追加パラメーターにアクセスできます。何らかの方法でこれらの値を使用してユーザー名とパスワードを変更することが目標である場合は、ここで行います。

于 2009-10-27T08:55:55.150 に答える
1

私はこのように行きます:

<bean id="authenticationProcessingFilter"  
    class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilter">
  ...
  <property name="authenticationDetailsSource">
    <bean class="org.acegisecurity.ui.AuthenticationDetailsSourceImpl">
        <property name="clazz"  
           value="com.MyAuthenticationDetails"/>
    </bean>
  </property>
</bean>  

これは、プロパティを保持するクラスです。

package com;
import javax.servlet.http.HttpServletRequest;
import org.acegisecurity.ui.WebAuthenticationDetails;
public class MyAuthenticationDetails extends WebAuthenticationDetails {
    public MyAuthenticationDetails() {
      super();
    }
    //This constructor will be invoqued by the filter
    public MyAuthenticationDetails(HttpServletRequest request) {
        super(request);
        this.myCustom1 = request.getParameter("myCustom1");
    }
    public String getMyCustom1() {
        return myCustom1;
    }
    private String myCustom1;
}

これで、ユーザー名、パスワード、および詳細が得られました。

于 2009-10-27T18:46:24.380 に答える