Spring SecurityContextHolder返回正确的用户';s值,但身份验证对象返回null

Spring SecurityContextHolder返回正确的用户';s值,但身份验证对象返回null,spring,security,authentication,Spring,Security,Authentication,我使用了两个登录页面,一个用于用户,另一个用于管理员。但是我已经在内存中存储了管理员信息,但是已经从数据库中获取了用户信息。这里的问题是,当我想使用身份验证对象时,它返回null。但是SecurityContextHolder给了我完美的价值。我想全局设置这个身份验证值,这样我的每个方法都可以拥有它 这是我的SecurityConfig类 // admin login class @Configuration @Order(1) public class AdminAuthorization e

我使用了两个登录页面,一个用于用户,另一个用于管理员。但是我已经在内存中存储了管理员信息,但是已经从数据库中获取了用户信息。这里的问题是,当我想使用身份验证对象时,它返回null。但是SecurityContextHolder给了我完美的价值。我想全局设置这个身份验证值,这样我的每个方法都可以拥有它

这是我的SecurityConfig类

// admin login class
@Configuration
@Order(1)
public class AdminAuthorization extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http.antMatcher("/admin/**").authorizeRequests().anyRequest().hasRole("ADMIN").and().formLogin()
                .loginPage("/adminLogin").loginProcessingUrl("/admin/dashboard").and().csrf().disable();
    }

    // for authentication
    @Autowired
    public void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication().withUser("admin").password(encoder().encode("admin")).roles("ADMIN");
    }
}

// Publisher login class
@Configuration
@Order(2)
public class PublisherAuthorization extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) {

        try {
            http.authorizeRequests()
            .antMatchers("/publisher/**").hasRole("PUBLISHER")
            .and().formLogin().loginPage("/login")
            .loginProcessingUrl("/login").successForwardUrl("/publisher/welcome")
            .failureUrl("/login?error").usernameParameter("username").passwordParameter("password");
            
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    // for authentication
    @Autowired
    public void configure(AuthenticationManagerBuilder auth)  {
        try {
            auth.jdbcAuthentication().dataSource(dataSource)
                    .usersByUsernameQuery("select username, password, active" + " from publisher where username=?")
                    .passwordEncoder(encoder())
                    .authoritiesByUsernameQuery("select username, authority " + "from authorities where username=?");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

@Bean
public static PasswordEncoder encoder() {
    return new BCryptPasswordEncoder();
}
家庭控制器

@PostMapping(value = { "/welcome", "/welcome/{QuestionPageNumber}/{ArticlePageNumber}" })
public ModelAndView page(Authentication auth, @PathVariable Optional<Integer> QuestionPageNumber,
        @PathVariable Optional<Integer> ArticlePageNumber) {
    
    
    System.out.println(auth==null); //returns true
    
    //but 
    
    Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
    
    System.out.println(authentication.getName());  //returns correct user's information
@PostMapping(值={”/welcome“,“/welcome/{QuestionPageNumber}/{ArticlePageNumber}”)
公共模型和视图页面(身份验证验证,@PathVariable可选问题页码,
@PathVariable(可选文章页码){
System.out.println(auth==null);//返回true
//但是
身份验证=SecurityContextHolder.getContext().getAuthentication();
System.out.println(authentication.getName());//返回正确的用户信息
现在,问题是,我不想使用这个代码

SecurityContextHolder.getContext().getAuthentication()

在每一行上。(我不知道原因!!)。。
我无法收集发布者的信息。管理员工作正常。

请尝试以下代码,而不是内存中的身份验证实现:

import org.springframework.security.core.userdetails.User;

String username = "ADMIN";
String encodedPassword = new BCryptPasswordEncoder().encode("admin");
List<SimpleGrantedAuthority> authList = Arrays.asList(new SimpleGrantedAuthority("ROLE_ADMIN"));
User user = new User(username, encodedPassword, authList);
auth.inMemoryAuthentication().withUser(user);
import org.springframework.security.core.userdetails.User;
字符串username=“ADMIN”;
字符串encodedPassword=new BCryptPasswordEncoder().encode(“admin”);
List authList=Arrays.asList(新的SimpleGrantedAuthority(“角色\管理员”);
User User=新用户(用户名、encodedPassword、authList);
auth.inMemoryAuthentication().withUser(用户);

尝试以下代码,而不是内存中的身份验证实现:

import org.springframework.security.core.userdetails.User;

String username = "ADMIN";
String encodedPassword = new BCryptPasswordEncoder().encode("admin");
List<SimpleGrantedAuthority> authList = Arrays.asList(new SimpleGrantedAuthority("ROLE_ADMIN"));
User user = new User(username, encodedPassword, authList);
auth.inMemoryAuthentication().withUser(user);
import org.springframework.security.core.userdetails.User;
字符串username=“ADMIN”;
字符串encodedPassword=new BCryptPasswordEncoder().encode(“admin”);
List authList=Arrays.asList(新的SimpleGrantedAuthority(“角色\管理员”);
User User=新用户(用户名、encodedPassword、authList);
auth.inMemoryAuthentication().withUser(用户);