如果我在@Service中实现UserDetailsS​​ervice,方法安全性不起作用

时间:2016-05-11 08:39:42

标签: spring spring-security

我已经在我的项目上实现了Spring Security。但是如果我在@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:抱歉,我没有足够的英语知识。

2 个答案:

答案 0 :(得分:0)

您需要在SimpleUserService中进行更改

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

在SecurityConfig中,使用@Qualifier自动装配UserService(“simpleUserService”)

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

答案 1 :(得分:0)

不要使用Spring注释(@Component@Service@Transactional@Repository注释接口,在实现类上添加注释。

删除@Transactional界面上的UserService,创建新课程UserServiceImpl并添加注释@Transactional

并将@PreAuthorize("hasRole('ROLE_SUPER')")注释移到实现方法上。