10

これは私のシナリオです:

  • Web アプリは、多くのアプリケーションに対して一種の SSO を実行します
  • ログインしているユーザーがリンクをクリックすると、アプリはユーザー情報 (名前、パスワード [役に立たない]、役割) を含む投稿を適切なアプリケーションに送信します。
  • これらのアプリケーションの 1 つに SpringSecurity を実装して、その力 (セッション内の権限、そのクラスによって提供されるメソッドなど) を利用しています。

したがって、リクエストからユーザー情報を取得し、カスタムDetailsUserServiceを介してデータベースから取得し、ユーザーに関する詳細情報 (電子メールなど) を取得し、認証を実行できるカスタムフィルターを開発する必要があります。リクエストから取得したロールに従って、そのユーザー。

事前認証フィルターを検討していましたが、それが正しい選択であるかどうかはわかりません。これらのオブジェクトは、プリンシパルがすでにセッションにあるときに使用されることが期待されているようで、以前の認証メカニズムによって配置されています (そうですか?)。

正しいフィルターを特定したら、次のように実行する必要があると思います。

GrantedAuthority[] ga= new GrantedAuthority[1];
ga[0] = new GrantedAuthorityImpl(myUser.getRole());

SecurityContext sc = SecurityContextHolder.getContext();
Authentication a = new UsernamePasswordAuthenticationToken(userName, userPwd, ga);
a = authenticationManager.authenticate(a);
sc.setAuthentication(a);

私の問題を解決するための適切な方向ですか?足りないものを見つけるのに役立つ提案はありますか?

皆さん、ありがとうございました、

ルカ

添加:

こんにちはXearxess!もう一度お邪魔して申し訳ありませんが、SpringSecurity 2.0.4 に準拠したコードの翻訳は思ったよりも難しいようです:S 問題は XML です... 別の構成を試しましたが、常に名前空間の問題に遭遇し、属性がありませんなど...

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:security="http://www.springframework.org/schema/security"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
              http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.4.xsd">  

    <security:http>
        <security:intercept-url pattern="/**" access="isAuthenticated()" />
        <security:logout logout-url="/logout" logout-success-url="http://milan-ias-vs.usersad.everis.int/DMTest/" invalidate-session="true" />
        <security:custom-filter position="PRE_AUTH_FILTER" ref="preAuthenticatedProcessingFilter" />
    </security:http>

    <bean id="preAuthenticatedProcessingFilter" class="it.novartis.ram.authentication.PreAuthenticatedProcessingFilter">
        <custom-filter position="PRE_AUTH_FILTER"/>
        <property name="authenticationManager" ref="authenticationManager" />
    </bean>

    <bean id="preauthAuthProvider" class="org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider">
        <property name="preAuthenticatedUserDetailsService">
            <bean class="it.novartis.ram.authentication.PreAuthenticatedUserDetailsService" />
        </property>
    </bean>

    <security:authentication-manager alias="authenticationManager">
        <security:authentication-provider ref="preauthAuthProvider" />
    </security:authentication-manager>

</beans>

CUSTOM-FILTER 要素を参照する 2 つの行は 2 つの異なる試行であり、どちらもエラーとして署名されています。フィルタの位置をプロパティとして指定するにはどうすればよいですか?

また、認証マネージャー定義の認証プロバイダー参照はエラーとしてマークされます。これもプロパティのように指定する必要があると思いますよね?

最後の一押しをいただければ幸いです ;) ありがとうございます。

ルカ

4

2 に答える 2

31

完全を期すために、Spring Security 4 では若干変更されています。たとえば、Java 構成を強くお勧めします。このようにして、Spring Boot との統合が容易になります。

上記の回答で指定された XML 構成と同等の Java 構成に従います。

@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.addFilterBefore(customAuthFilter(), AbstractPreAuthenticatedProcessingFilter.class)
            .authenticationProvider(preauthAuthProvider())
            .authorizeRequests()
            .anyRequest().authenticated();
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.authenticationProvider(preauthAuthProvider());
    }

    @Bean
    public PreAuthenticatedAuthenticationProvider preauthAuthProvider() {
        PreAuthenticatedAuthenticationProvider preauthAuthProvider =
            new PreAuthenticatedAuthenticationProvider();
                preauthAuthProvider.setPreAuthenticatedUserDetailsService(
                    userDetailsServiceWrapper());
        return preauthAuthProvider;
    }

    @Bean
    public OnlyRolesPreAuthenticatedUserDetailsService userDetailsServiceWrapper() {
        OnlyRolesPreAuthenticatedUserDetailsService service =
            new MyPreAuthenticatedUserDetailsService();
        return service;
    }

    @Bean
    public MyPreAuthenticatedProcessingFilter customAuthFilter() throws Exception {
        MyPreAuthenticatedProcessingFilter filter = new MyPreAuthenticatedProcessingFilter();
        filter.setAuthenticationManager(authenticationManager());
        return filter;
    }
}

インターネットの例は非常に基本的であり、Spring のドキュメントにはそのような詳細が欠けているため、上記のコードは価値があると思います。

于 2016-09-28T14:52:18.760 に答える
19

はい、事前認証シナリオはまさにあなたが探しているものです。

これらのオブジェクトは、プリンシパルがすでにセッションにあるときに使用されることが期待されているようで、以前の認証メカニズムによって配置されています (そうですか?)。

実際には、必要に応じて、事前認証を使用PreAuthenticatedAuthenticationTokenしてリクエストから作成できます。別の質問で説明したことをいくつか実行してください

最初に拡張AbstractPreAuthenticatedProcessingFilterして、リクエストからユーザー名とロールを取得します。

public class MyPreAuthenticatedProcessingFilter
    extends AbstractPreAuthenticatedProcessingFilter {

  public MyPreAuthenticatedProcessingFilter(
      AuthenticationManager authenticationManager) {
    setAuthenticationDetailsSource(new MyAuthenticationDetailsSource());
  }

  @Override
  protected Object getPreAuthenticatedPrincipal(HttpServletRequest request) {
    return "Anonymous";
  }

  @Override
  protected Object getPreAuthenticatedCredentials(HttpServletRequest request) {
    return "N/A";
  }

  public static class MyAuthenticationDetailsSource implements 
      AuthenticationDetailsSource<HttpServletRequest, MySessionUserDetails> {
    // roles probably should be encrypted somehow
    static final String ROLES_PARAMETER = "pre_auth_roles";

    @Override
    public MySessionUserDetails buildDetails(HttpServletRequest req) {
      // create container for pre-auth data
      return new MySessionUserDetails(req.getParameter(ROLES_PARAMETER));
    }
  }
}

MySessionUserDetailsクラスは、Spring を役割とともに List ofSimpleGrantedAuthorityまたはその他のGrantedAuthority実装に分割します。また、 List が推奨され、 よりも優れていGrantedAuthority[]ます。

次に、次を実装しAuthenticationUserDetailsServiceます。

public class MyPreAuthenticatedUserDetailsService implements 
    AuthenticationUserDetailsService<PreAuthenticatedAuthenticationToken> {

  @Override
  public UserDetails loadUserDetails(PreAuthenticatedAuthenticationToken token)
      throws UsernameNotFoundException {
    MySessionUserDetails sessionUserDetails =
        (MySessionUserDetails) token.getDetails();
    List<GrantedAuthority> authorities = sessionUserDetails.getAuthorities();
    return new User(token.getName(), "N/A", true, true, true, true, authorities);
  }
}

次に、XML でブロックを一緒に接続します。

<security:http use-expressions="true">
  <security:intercept-url pattern="/**" access="isAuthenticated()" />
  <security:custom-filter position="PRE_AUTH_FILTER"
      ref="myPreAuthenticationFilter" />
</security:http>

<bean id="myPreAuthenticationFilter"
    class="com.example.MyPreAuthenticatedProcessingFilter">
  <property name="authenticationManager" ref="authenticationManager" />
</bean>

<bean id="preauthAuthProvider" class="org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider">
  <property name="preAuthenticatedUserDetailsService">
    <bean class="com.example.MyPreAuthenticatedUserDetailsService" />
  </property>
</bean>

<security:authentication-manager alias="authenticationManager">
  <security:authentication-provider ref="preauthAuthProvider" />
</security:authentication-manager>

そして出来上がり!アプリケーションで使用する認証済みUserプリンシパルが必要です。

私がここに書いたコードには、Spring Security 3.1 が必要です。これを使用する場合は、これを強くお勧めします (Spring 3.0.7+ が必要です)。また、Spring Security リファレンス マニュアルはあなたの味方です!

于 2012-09-18T18:04:37.087 に答える