Spring boot - Попробуйте аутентифицировать пользователя из БД mySQL. - Требуются полномочия для текстового представления. - PullRequest
0 голосов
/ 17 октября 2018

2018-10-17 20: 05: 37.715 ОШИБКА 15968 --- [nio-8090-exec-3] waUsernamePasswordAuthenticationFilter: при попытке аутентификации пользователя произошла внутренняя ошибка.

org.springframework.security.authentication.InternalAuthenticationServiceException: требуется текстовое представление предоставленного полномочия

Вот мое SecurityConfig :

package com.project.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
@ComponentScan(basePackages= {"com.project.*"})
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled=true)
@EnableAutoConfiguration(exclude = {SecurityAutoConfiguration.class})
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private MyAppUserDetailsService myAppUserDetailsService;    
@Override
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
    .antMatchers("/app/secure/**").hasAnyRole("ADMIN","USER")
    .and().formLogin()  //login configuration
            .loginPage("/app/login")
            .loginProcessingUrl("/app-login")
            .usernameParameter("userName")
            .passwordParameter("password")
            .defaultSuccessUrl("/app/secure/temployee-details") 
    .and().logout()    //logout configuration
    .logoutUrl("/app-logout") 
    .logoutSuccessUrl("/app/login")
    .and().exceptionHandling() //exception handling configuration
    .accessDeniedPage("/app/error");
} 
    @Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
          BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
          auth.userDetailsService(myAppUserDetailsService).passwordEncoder(passwordEncoder);
}
} 

И UserDetailsService :

package com.project.config;
import java.util.Arrays;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
import com.project.dao.IUserInfoDAO;
import com.project.entity.UserInfo;
@ComponentScan(basePackages= {"com.project.*"})
@Service
public class MyAppUserDetailsService implements UserDetailsService {
@Autowired
private IUserInfoDAO userInfoDAO;
@Override
public UserDetails loadUserByUsername(String userName)
        throws UsernameNotFoundException {
    UserInfo activeUserInfo = userInfoDAO.getActiveUser(userName);
    GrantedAuthority authority = new SimpleGrantedAuthority(activeUserInfo.getRole());
    UserDetails userDetails = (UserDetails)new User(activeUserInfo.getUserName(),
            activeUserInfo.getPassword(), Arrays.asList(authority));
    return userDetails;
}
}

UserInfoDao :

package com.project.dao;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import com.project.entity.TEmployee;
import com.project.entity.UserInfo;
@ComponentScan(basePackages= {"com.project.*"})
@Repository
@Transactional
public class UserInfoDAO implements IUserInfoDAO {
@PersistenceContext 
private EntityManager entityManager;
public UserInfo getActiveUser(String userName) {
    UserInfo activeUserInfo = new UserInfo();
    short enabled = 1;
    List<?> list = entityManager.createQuery("SELECT u FROM UserInfo u WHERE userName=?1 and enabled=?2")
            .setParameter(1, userName).setParameter(2, enabled).getResultList();
    if(!list.isEmpty()) {
        activeUserInfo = (UserInfo)list.get(0);
    }
    return activeUserInfo;
}
@SuppressWarnings("unchecked")
@Override
public List<TEmployee> getAllUserEmployees() {
    String hql = "FROM TEmployee as t ORDER BY t.employee_id";
    return (List<TEmployee>) entityManager.createQuery(hql).getResultList();
}   
}     

Я действительно не понимаю, почему я все еще получил. Требуется авторизованное текстовое представление.
Я добавил правильную роль в столбец «роль» в моей базе данных: ROLE_ADMIN или ROLE_USER, и здесь все в порядке.

Некоторые журналы:

2018-10-17 20: 05: 29.932 INFO 15968 --- [nio-8090-exec-1] oaccC [Tomcat]. [Localhost]. [/]: Инициализация Spring FrameworkServlet 'dispatcherServlet' 2018-10-17 20: 05: 29.932 INFO 15968 --- [nio-8090-exec-1] osweb.servlet.DispatcherServlet: FrameworkServlet 'dispatcherServlet': инициализация началась 2018-10-17 20: 05: 29.938 INFO 15968 --- [nio-8090-exec-1] osweb.servlet.DispatcherServlet: FrameworkServlet 'dispatcherServlet': инициализация завершена за 6 мс 2018-10-17 20: 05: 37.694 INFO 15968--- [nio-8090-exec-3] ohhiQueryTranslatorFactoryInitiator: HHH000397: Использование ASTQueryTranslatorFactory 2018-10-17 20: 05: 37.701 DEBUG 15968 --- [nio-8090-exec-3] org.hibernate.SQL: выберите userinfo0_.userid как userid1_1_, userinfo0_.enabled как enabled2_1_, userinfo0_.password в качестве password3_1_, userinfo0_.role в качестве role4_1_ из tuserid userinfo0_, где userinfo0_.userid =?и userinfo0_.enabled =?2018-10-17 20: 05: 37.701 TRACE 15968 --- [nio-8090-exec-3] ohtype.descriptor.sql.BasicBinder: параметр привязки [1] как [VARCHAR] - [kudelam] 2018-10-1720: 05: 37.701 TRACE 15968 --- [nio-8090-exec-3] ohtype.descriptor.sql.BasicBinder: параметр привязки [2] для [SMALLINT] - [1] 2018-10-17 20: 05: 37.715ОШИБКА 15968 --- [nio-8090-exec-3] waUsernamePasswordAuthenticationFilter: при попытке аутентификации пользователя произошла внутренняя ошибка.

org.springframework.security.authentication.InternalAuthenticationServiceException: требуется предоставление полномочий для текстового представления

Не могли бы вы взглянуть и осветить это?

1 Ответ

0 голосов
/ 18 октября 2018

Попробуйте это вместо

GrantedAuthority authority = new SimpleGrantedAuthority(activeUserInfo.getRole());
UserDetails userDetails = (UserDetails)new User(activeUserInfo.getUserName(),
        activeUserInfo.getPassword(), Arrays.asList(authority));

Do

Set<GrantedAuthority> grantedAuthorities = new HashSet<>();
grantedAuthorities.add(new SimpleGrantedAuthority(activeUserInfo.getRole()));


return new org.springframework.security.core.userdetails.User(activeUserInfo.getUsername(),
                                                              activeUserInfo.getPassword(),
                                                              grantedAuthorities);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...