0

アクセス制御のためにオブジェクトのリストを使用する必要があります。そのリストを取得するためのクエリはかなり複雑で時間がかかるので、ユーザーがサーバーで認証するときに、そのオブジェクトをユーザーオブジェクトにキャッシュしたいと思います。LoadTimeWeavingなしでサービスを使用してUserDetailsをカスタマイズする

public class LdapUserDetailsContextMapper implements UserDetailsContextMapper { 

private final org.slf4j.Logger log = LoggerFactory.getLogger(this.getClass()); 

private DataService dataService; 

public UserDetails mapUserFromContext(DirContextOperations ctx, String username, 
             Collection<? extends GrantedAuthority> authorities) { 

    AppUser user = new AppUser(); 
    user.setUsername(ctx.getStringAttribute("uid")); 
    user.setName(ctx.getStringAttribute("cn")); 
    user.setSurname(ctx.getStringAttribute("sn")); 
    user.setMail(ctx.getStringAttribute("mail")); 
    user.setRoleUser();  

user.setManaged(dataService.getManagedData(user.getMail())); 

        return user; 
       } 

問題は、私はない方法を見ていないということである:データを使用してユーザーオブジェクトを埋めるために

@Configuration 
public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 

... 


     @Override 
     public void init(AuthenticationManagerBuilder auth) throws Exception { 
      String ldapURI = "ldap://" + ldaHost + ":" + ldapPort + "/" + ldapBasis; 

      DefaultSpringSecurityContextSource contextSource = new DefaultSpringSecurityContextSource(ldapURI); 
      contextSource.setUserDn(ldapUser); 
      contextSource.setPassword(ldapPassword); 
      contextSource.afterPropertiesSet(); 

      LdapAuthenticationProviderConfigurer<AuthenticationManagerBuilder> ldapAuthenticationProviderConfigurer = auth 
        .ldapAuthentication().userDetailsContextMapper(new LdapUserDetailsContextMapper()); 

      ldapAuthenticationProviderConfigurer 
        .userSearchFilter("(&(criteria={0}))") 
        .userSearchBase("ou=usersearchbase").contextSource(contextSource); 
     } 
} 

ContextMapper: は私がしようとUserDetailServiceのカスタマイズされた実装と、このWebSecurityConfigでこの問題を解決することを決めましたContextMapperも@Configureクラスも、@Autowiredを不可能にするマネージドBeanではありません。 LoadTimeWeavingを避けたいのは、これを使用すると展開が非常に困難になるからです。別の選択肢がありますか?

これらの2つの同様の問題が見つかりました。Why is my Spring @Autowired field null?は、管理対象Beanに変換できるControllerクラスで同じ問題があります。上記の両方の解決策は私のためには機能しませんでした(dataServiceは常にnullでした)。 Spring Boot, @Autowire into an unmanaged class using @Configurable and load time weavingはLoadTimeWeavingを再度推奨します。

(注射したDataServiceとContextMapper-コンストラクタを呼び出すしようとしている)私はまた、initメソッドで@Autowiredを使用して言及する見かけの解決策を見つけましたが、私はそれが動作するようにゲットすることができませんでしたどちらか

+1

'LdapUserDetailsContextMapper'を作成してください。新しいインスタンスを作成する代わりに、そのロジックを '@ Bean'アノテートされたメソッドに置き、それを呼び出します。あなたは物事を考えすぎている... –

+0

'@ Bean'は、シングルトンを宣言して作成する点で' @ Service/@ Component etc'と同じことをしませんか?私はこれが事実だと思ったので、WebSecurityConfigクラスに結果を注入することができませんでした –

+1

そしてなぜそうではありませんか?あなたのマッパーには、完全にシングルトンになり得る状態はありません。あなたが今それを宣言すると、それはシングルトンでさえありますが、唯一の違いは、それが春の管理ではないということです。 –

答えて

1

ちょうどそれ作りますスプリングマネージドビーン。

@Configuration 
public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 

... 


     @Override 
     public void init(AuthenticationManagerBuilder auth) throws Exception { 
      String ldapURI = "ldap://" + ldaHost + ":" + ldapPort + "/" + ldapBasis; 

      DefaultSpringSecurityContextSource contextSource = new DefaultSpringSecurityContextSource(ldapURI); 
      contextSource.setUserDn(ldapUser); 
      contextSource.setPassword(ldapPassword); 
      contextSource.afterPropertiesSet(); 

      LdapAuthenticationProviderConfigurer<AuthenticationManagerBuilder> ldapAuthenticationProviderConfigurer = auth 
        .ldapAuthentication().userDetailsContextMapper(userDetailsContextMapper()); 

      ldapAuthenticationProviderConfigurer 
        .userSearchFilter("(&(criteria={0}))") 
        .userSearchBase("ou=usersearchbase").contextSource(contextSource); 
     } 
    @Bean 
    public LdapUserDetailsContextMapper userDetailsContextMapper() { 
     return new LdapUserDetailsContextMapper(); 
    } 
} 

そして@AutowiredLdapUserDetailsContextMapper内部のあなたのフィールドに注釈を付けます。

関連する問題