SecurityContextHolder возвращает правильное значение пользователя, но объект аутентификации возвращает null - PullRequest
1 голос
/ 20 июня 2020

Я использовал 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 ();

в каждой строке (я не знаю почему !!) .. Я не могу собрать информацию о моем издателе. Админ работает нормально.

1 Ответ

0 голосов
/ 20 июня 2020

Попробуйте этот код вместо реализации аутентификации в памяти:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...