Как найти вошедшего в систему пользователя и роль с помощью Spring-Security с помощью пользовательского AuthenticationManagerBuilder - PullRequest
0 голосов
/ 24 сентября 2019

Я реализовал пользовательскую систему регистрации и входа в систему, используя HttpSecurity и AuthenticationManagerBuilder, который вводит данные во встроенную базу данных H2.Я хочу знать, как я могу получить отображаемое имя пользователя и узнать, какую роль они играют.

Я использовал sec: authorize в моем html-файле, и он показывает авторизованный текст, хотя и не должен.Например, пользователь с ролью USER может видеть текст, авторизованный только для роли ADMIN.Я думаю, что мне не хватает реализации UserDetailsService, однако я не уверен, как это реализовать.

Вот мой класс домена пользователя:

public class User{

    private int id;

    private String name;

    private String lastName;

    private String username;

    private String password;

    private String email;

    private String enabled;

Вот мой класс WebSecurityConfiguration

@EnableWebSecurity
@Configuration
@EnableWebMvc
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {


    @Autowired
    DataSource dataSource;

    @Override
    protected void configure(final HttpSecurity http) throws Exception {
        http
                .csrf()
                .disable()
                .authorizeRequests()
                .antMatchers("/h2-console/**", "/registration")
                .permitAll()
                .anyRequest().authenticated()
                .and()
                .formLogin()
                .permitAll()
                .and()
                .logout()
                .permitAll();

        http.csrf()
                .ignoringAntMatchers("/h2-console/**");
        http.headers()
                .frameOptions()
                .sameOrigin();
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {

        //Move these to repository and call method
        String userbyUsernameQuery = "select username, password, '1' as enabled from auth_user where username=?;";
        String rolebyUsernameQuery = "SELECT auth_user.username, auth_role.role_name as authority from auth_user\n" +
                "INNER JOIN auth_user_role ON auth_user.auth_user_id = auth_user_role.auth_user_id\n" +
                "INNER JOIN auth_role ON auth_role.auth_role_id = auth_user_role.auth_role_id\n" +
                "WHERE auth_user.username =?";


        auth.jdbcAuthentication()
                .dataSource(dataSource)
                .usersByUsernameQuery(userbyUsernameQuery)
        .authoritiesByUsernameQuery(rolebyUsernameQuery)
        .passwordEncoder(passwordEncoder());
    }
}

А вот страница, на которой я тестирую выходные данные зарегистрированных пользователей и ролей:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/extras/spring-security">>
<head>
    <meta charset="UTF-8">
    <title>Main Page</title>
</head>
<body>

<h1> Main Page</h1>

<div sec:authorize="isAuthenticated()">
    This content is only shown to authenticated users.
</div>
<div sec:authorize="hasRole('ROLE_ADMIN')">
    This content is only shown to administrators.
</div>
<div sec:authorize="hasRole('ROLE_USER')">
    This content is only shown to users.
</div>

Logged user: <span sec:authentication="name"></span>
Roles: <span sec:authentication="principal.authorities">[ROLE_USER, ROLE_ADMIN]</span>

</body>
</html>

У меня такое ощущение, что мне нужно реализовать UserDetailsService.Я хотел бы несколько советов, куда идти отсюда.Нужно ли создавать собственный класс UserDetailsService?

Нужен ли класс роли Role, такой как User?Если да, то как мне использовать это, чтобы ограничить доступ к определенным страницам

Я хочу добиться отображения вошедшего в систему пользователя на странице, и если у него есть полномочия / права на просмотр страницы.

...