Spring Security возвращает 403 по любому запросу - PullRequest
0 голосов
/ 18 марта 2019

Я создал двух пользователей с ролями ADMIN и USER, но каждый раз, когда я пытаюсь войти в систему, сервер возвращает 403.

WebSecurityConfig:

 @Override
    protected void configure(HttpSecurity http) throws Exception {

        http.authorizeRequests().antMatchers("/admin/**")
                .access("hasAnyAuthority('ADMIN','USER')")
                .and().formLogin().loginPage("/login").failureUrl("/login?error")
                .usernameParameter("username")
                .passwordParameter("password")
                .and().logout().logoutSuccessUrl("/login?logout")
                .and().csrf().disable();
    }

мой UserService, который отображает моих пользователей из базы данных:

@Transactional(readOnly = true)
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

        User user = userDao.findByUserName(username);
        org.springframework.security.core.userdetails.User.UserBuilder builder = null;
        if (user != null) {

            builder = org.springframework.security.core.userdetails.User.withUsername(username);
            builder.disabled(!user.isEnabled());
            builder.password(user.getPassword());
            String[] authorities = user.getUserRole()
                    .stream().map(a -> a.getRole()).toArray(String[]::new);

            builder.authorities(authorities);
        } else {
            throw new UsernameNotFoundException("User not found.");
        }
        return builder.build();
    }

csrf отключен. Я также использую метод hasAnyUthority *, поэтому мне не нужен префикс ROLE_. Я использую пружину безопасности 5

Мой логин.html

<head>
    <meta charset="utf-8"/>
    <link rel="stylesheet" type="text/css" href="resources/style.css"/>
</head>
<body>
<div class="container">
    <header>
        <h1>Login</h1>
    </header>
    <div class="alert alert-error" th:if="${error != null}">
        <div>
            <strong>Okay, Houston, we've had a problem here.</strong>
        </div>
    </div>
    <div class="alert alert-error" th:if="${logout != null}">
        <div>
            <strong>Okay, Houston, you're logged out successfully .</strong>
        </div>
    </div>
    <form class="form-horizontal" th:action="@{/login}" method="POST">
        <fieldset>
            <div class="control-group">
                <label class="control-label">Login</label>
                <div class="controls">
                    <div class="input-prepend">
                        <span class="add-on">@</span>
                        <input id="loginField" name="username" class="span3" type="text"/>
                    </div>
                </div>
            </div>
            <div class="control-group">
                <label class="control-label">Password</label>
                <div class="controls">
                    <input id="passwordField" name="password" class="span3" type="password"/>
                </div>
            </div>
            <div class="form-actions">
                <button id="loginButton" class="btn btn-primary" type="submit">Login</button>
            </div>
        </fieldset>
    </form>
</div>
</body>

Я сделал все, как в примерах проектов, но он все еще не хочет войти в систему.

Ответы [ 2 ]

0 голосов
/ 22 марта 2019

Может быть, это кому-нибудь поможет, поэтому я отвечу на вопрос. Я не мог войти, потому что когда я запускаю свою программу, я добавляю новых пользователей с незашифрованным паролем. Но Spring Security все равно его расшифровывает, поэтому я не смог войти и получил 403 ответа. Все, что мне нужно, это зашифровать пароль перед добавлением его в базу данных.

0 голосов
/ 18 марта 2019

Я не вижу, чтобы hasAnyAuthority(...) работал без "ROLE_", попробуйте .access("hasAnyRole('ADMIN','USER')") или .access("hasAnyRole('ROLE_ADMIN','ROLE_USER')").

Обратите внимание, что в String[] authorities = user.getUserRole().stream().map(a -> a.getRole()).toArray(String[]::new); вам нужно в a.getRole() возврат с префиксом ROLE_ или то же, что у вас будет в hasAnyAuthority(...)

Например, если ваш a.getRole() вернет WHAT_EVER, чем hasAnyAuthority('WHAT_EVER) должен работать, но hasAnyRole('WHAT_EVER') будет ожидать, что a.getRole() вернет ROLE_WHAT_EVER

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...