首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring boot、spring安全覆盖UserDetailsService

Spring boot、spring安全覆盖UserDetailsService
EN

Stack Overflow用户
提问于 2015-02-07 10:28:37
回答 1查看 3.2K关注 0票数 7

从spring安全xml配置迁移到Spring Security中的Java Config。

在我的扩展WebSecurityConfigurerAdapter的类SecurityConfiguration中。但是,问题是安全筛选器没有使用userDetailsService,特别是UsernamePasswordAuthenticationFilter。我看了一下启动程序,它似乎不是在Spring boot创建默认InMemoryUserDetailsManager之前创建的。

代码语言:javascript
复制
@Configuration
@EnableWebMvcSecurity
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http)
      throws Exception {

      http.userDetailsService(userDetailsService);

    }
}

我还尝试使用自定义注入的ApplicationUserDetailsService覆盖该类中的userDetailsServiceBean和userDetailsService。

代码语言:javascript
复制
@Bean(name="myUserDetailsBean")
@Override
public UserDetailsService userDetailsServiceBean() {
    return userDetailsService;
}

@Override
public UserDetailsService userDetailsService() {

    return userDetailsService;
}

然而,当我尝试覆盖authenticationManagerBean时,它看起来像是在spring boot配置初始化之前调用了我的配置,但它抛出了一个错误(如下所示):在初始化UsernamePasswordAuthenticationFilter时存在循环引用。我真的需要覆盖authenticationManagerBean吗,因为我需要定义进入UsernamePasswordAuthenticationFilter的内容。

代码语言:javascript
复制
@Bean(name="myAuthenticationManager")
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
    return super.authenticationManagerBean();
}

。。

代码语言:javascript
复制
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter]: Circular reference involving containing bean 'securityBeansConfiguration' - consider declaring the factory method as static for independence from its containing instance. Factory method 'usernamePasswordAuthenticationFilter' threw exception; nested exception is java.lang.IllegalArgumentException: successHandler cannot be null
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:189) ~[spring-beans-4.1.4.RELEASE.jar:4.1.4.RELEASE]
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:588) ~[spring-beans-4.1.4.RELEASE.jar:4.1.4.RELEASE]
... 70 common frames omitted

想法?

EN

回答 1

Stack Overflow用户

发布于 2015-09-01 03:36:00

您好,有一种简单的方法可以覆盖UserDetailsService

代码语言:javascript
复制
import com.dog.care.domain.User;
import com.dog.care.repository.UserRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import javax.inject.Inject;
import java.util.Optional;

@Component("userDetailsService")
public class UserDetailsService implements org.springframework.security.core.userdetails.UserDetailsService {

private final Logger log = LoggerFactory.getLogger(UserDetailsService.class);

@Inject
private UserRepository userRepository;

@Override
@Transactional
public UserDetails loadUserByUsername(final String login) {
    log.debug("Authenticating {}", login);
    String lowercaseLogin = login.toLowerCase();
    Optional<User> userFromDatabase =  userRepository.findOneByLogin(lowercaseLogin);
    return userFromDatabase.map(user -> {
        if (!user.getActivated()) {
            throw new UserNotActivatedException("User " + lowercaseLogin + " was not activated");
        }
        return new CustomUserDetails(user);
    }).orElseThrow(() -> new UsernameNotFoundException("User " + lowercaseLogin + " was not found in the database"));
}
}

这很重要:@Component("userDetailsService")

谢谢Aleksandar

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28377895

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档