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