2016-05-11 5 views
0

私は自分のプロジェクトでSpring Securityを実装しました。しかし、@ServiceにUserDetailsS​​erviceを実装すると、メソッドのセキュリティアノテーションは無視されます。 このコードで何が問題になっていますか?@ServiceにUserDetailsS​​erviceを実装するとメソッドのセキュリティが機能しない

@Transactional 
public interface UserService extends UserDetailsService { 

    @PreAuthorize("hasRole('ROLE_SUPER')") /* it's ignored. */ 
    void update(UserEditForm form); 

    @Override 
    User loadUserByUsername(String username) throws UsernameNotFoundException; 
} 

@Service 
public class SimpleUserService implements UserService { 
    // ommitted 
} 

@Transactional 
public interface SomeService{ 

    @PreAuthorize("hasRole('ROLE_SUPER')") /* it's working fine */ 
    void doSomething(); 
} 

@Service 
public class SimpleSomeService implements SomeService { 
    // ommitted 
} 

@Configuration 
@EnableWebSecurity 
public class SecurityConfig extends WebSecurityConfigurerAdapter { 

    @Autowired 
    PasswordEncoder passwordEncoder; 

    @Autowired 
    UserService userService; 

    @Override 
    protected void configure(AuthenticationManagerBuilder auth) throws Exception { 
     auth.userDetailsService(userService).passwordEncoder(passwordEncoder); 
    } 

    // ommitted 
} 

ps:申し訳ありませんが十分な英語の知識がありません。

+0

ユーザーが何らかの役割を果たす前に、承認しようとしています。 –

+0

@Sam私は分かりません。どういう意味ですか? – hurelhuyag

+0

認証オブジェクトを設定するときにユーザーが自分の役割を果たす(loadUserByUsernameメソッドでこれを行います)が、その前にそのメソッドを呼び出す場合は... @preAuthorizeをインターフェイスで使用しないでください –

答えて

0

あなたは次のようにSimpleUserServiceに変更を加える必要があり、この

@Service("simpleUserService") 
public class SimpleUserService implements UserService { 
    // ommitted 
} 

とSecurityConfigで、@Qualifier( "simpleUserService")とAutowire UserServiceの

@Autowired 
@Qualifier("simpleUserService") 
UserService userService; 
+0

実装されているBeanはUserDetailsS​​erviceが1つだけです。実際に私は同じクラスでUserDetailsS​​erviceと@Securedを使いたいと言っています。 – hurelhuyag

0

春の注釈とのインタフェースに注釈を付けないでください( @Component@Service@Transactional@Repository)、実装クラスにアノテーションを追加します。

インターフェイスで@Transactionalを削除し、新しいクラスUserServiceImplを作成し、注釈@Transactionalを追加します。

また、@PreAuthorize("hasRole('ROLE_SUPER')")アノテーションを実装メソッドに移動します。

+0

違いはありません。実際それはそうではありません。それは、同じクラスで@Securedを使ってUserDetailsS​​erviceを使用することができないことです – hurelhuyag

関連する問題