Работает нормально?
Нет, у вас неверная строка запроса в .authoritiesByUsernameQuery
аргументе метода.
Тип возвращаемого запроса, т. Е. Набор результатов должен содержать имя пользователя ироль как
SELECT username, role
Если запрос на соединение приводит к имени столбца набора результатов, как показано ниже:
Вы должны изменить в соответствии с даннымниже:
Используя псевдоним SELECT ud.username AS username, rm.name AS role
Я пробовал это: antMatchers ("/ mypage") .hasRole ("MODERATOR"), но выдает ошибку 403
Не будет работать, потому что ваша авторизационная часть была неверной.
Как мне сказать Spring для поискароли пользователя из столбца role_name таблицы ROLE?
Требуется полная настройка аутентификации и авторизации. См. Ниже для того же.
Я приведу один рабочий пример:
Учтите, что в вашем требовании есть аналогичные три таблицы userdetails
, rolemaster
и user_role_mapping
, как указано ниже.
Тогда ваша конфигурация будет
@Configuration
@EnableWebSecurity
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter
{
@Autowired
DataSource dataSource;
@Autowired
public void configAuthentication(AuthenticationManagerBuilder auth) throws Exception
{
//If you want to store plain password you can use NoOpPasswordEncoder
auth.jdbcAuthentication().dataSource(dataSource).passwordEncoder(passwordEncoder())
.usersByUsernameQuery("select username, password, enabled from userdetails where userName=?")
.authoritiesByUsernameQuery(
"SELECT ud.username AS username, rm.name AS role FROM user_role_mapping map " +
"INNER JOIN userdetails ud ON map.userId = ud.id " +
"INNER JOIN rolemaster rm ON map.roleId = rm.id where userName = ?");
}
@Override
protected void configure(final HttpSecurity http) throws Exception
{
http
.authorizeRequests()
.antMatchers("/resources/**", "/", "/login", "/api/**").permitAll()
.antMatchers("/config/**", "/app/admin/**")
.hasRole("ADMIN")
.antMatchers("/app/user/**")
.hasAnyRole("ADMIN", "USER")
.and().exceptionHandling().accessDeniedPage("/403")
.and().formLogin()
.loginPage("/login")
.usernameParameter("userName").passwordParameter("password")
.defaultSuccessUrl("/app/user/dashboard")
.failureUrl("/login?error=true")
.and().logout()
.logoutSuccessHandler(new CustomLogoutSuccessHandler())
.invalidateHttpSession(true)
.and()
.csrf()
.disable();
http.sessionManagement().maximumSessions(1).expiredUrl("/login?expired=true");
}
@Bean
public PasswordEncoder passwordEncoder()
{
return new BCryptPasswordEncoder();
}
}
Часть авторизации
При проходной авторизации для таких ресурсов, какjavascript и css, которые хранятся в папке ресурсов.
.antMatchers("/resources/**", "/", "/login", "/api/**").permitAll()
Для URL-адресов администратора
.antMatchers("/config/**", "/app/admin/**").hasRole("ADMIN")
Для URL-адресов, к которым могут обращаться несколько ролей
.antMatchers("/app/user/**").hasAnyRole("ADMIN", "USER")
И.formLogin()
конфигурация:
.usernameParameter("userName").passwordParameter("password")
// Use above line of code if your login form param names are different
// than defaults -> "username" "password"
.defaultSuccessUrl("/app/user/dashboard")
// If defaultSuccessUrl not configured then after login success redirects to "/"
Часть обработки исключений
.exceptionHandling().accessDeniedPage("/403")
//If you want custom denied screen to be displayed.