1 回答
TA贡献1847条经验 获得超11个赞
效果好吗?
不,方法参数中的查询字符串错误.authoritiesByUsernameQuery
。
查询返回类型即结果集应该是用户名和角色
SELECT username, role
如果连接查询结果结果集列名称如下所示:
您应该修改为如下所示:
通过使用别名SELECT ud.username AS username, rm.name AS role
我试过这个: antMatchers("/mypage").hasRole("MODERATOR") 但它抛出 403 错误
它不会工作,因为您的授权部分不正确。
我应该如何告诉Spring从ROLE表的role_name列中查找用户的角色?
需要完整的认证和授权配置。请参阅下面的相同内容。
我将举一个可行的例子:
考虑您的要求具有类似的三个表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();
}
}
授权部分
绕过对存储在 resources 文件夹中的 javascript 和 css 等资源的授权。
.antMatchers("/resources/**", "/", "/login", "/api/**").permitAll()
对于管理员网址
.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.
添加回答
举报