Я использовал 2 страницы входа, одну для пользователей и другую для администратора. Но я сохранил информацию администратора в памяти, но получил информацию о пользователе из базы данных. Проблема здесь в том, что когда я хочу использовать объект аутентификации, он возвращает значение 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();
}
HomeController
@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
Теперь, проблема в том, что я не использую этот код
SecurityContextHolder.getContext (). getAuthentication ();
в каждой строке (я не знаю почему !!) .. Я не могу собрать информацию о моем издателе. Админ работает нормально.