La gestión de autorización de roles se puede configurar a través del marco:
// 1.可以指定请求方法、路径匹配、所需角色
.antMatchers(HttpMethod.POST,"/user/*").hasRole("ADMIN")
// 如果配置hasRole,对应userDetailService授权时入参为"ROLE_ADMIN",因为在验证时框架会拼接"ROLE_"前缀,完成匹配
// 2.多个权限判断联合使用时可用权限表达式,如下,同时使用角色和IP地址授权:
.access("hasRole('ADMIN') and hasIpAddress('xxx')")
Gestión dividida de autorización general y autorización de proyecto:
1. Nueva interfaz de configuración de autorización AuthorizeConfigProvider:
/**
* 授权配置接口
*
* @author zhaohaibin
*/
public interface AuthorizeConfigProvider {
/**
* authorizeRequests
*
* 后续方法调用基于authorizeRequests方法返回的对象,所以入参为authorizeRequests方法返回的对象
*
* @param config
*/
void config(ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry config);
}
2. Nueva implementación de interfaz de configuración de autorización-implementación de autorización general:
/**
* 授权配置接口实现
*
* @author zhaohaibin
*/
@Component
@Order(Integer.MIN_VALUE)
public class DemoAuthorizeConfigProvider implements AuthorizeConfigProvider {
@Autowired
private SecurityProperties securityProperties;
@Override
public void config(ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry config) {
config.antMatchers( // API
"/swagger-ui.html",
// 默认登录页
SecurityConstants.DEFAULT_UNAUTHENTICATION_URL,
// 自定义登录页(demoLogin)
securityProperties.getBrowser().getLoginPage(),
// 验证码
SecurityConstants.DEFAULT_VALIDATE_CODE_URL_PREFIX + "/*",
securityProperties.getBrowser().getSignUpUrl(),
securityProperties.getBrowser().getSession().getSessionInvalidUrl(),
securityProperties.getBrowser().getSignOutUrl()).permitAll();
}
}
3. Nueva interfaz de gestión de configuración de autorización:
/**
* 授权配置管理接口
*
* @author zhaohaibin
*/
public interface AuthorizeConfigManager {
void config(ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry config);
}
4. Nueva implementación de interfaz de gestión de configuración de autorización:
/**
* 授权认证管理接口实现类
*
* @author zhaohaibin
*/
@Component
public class DemoAuthorizeConfigManager implements AuthorizeConfigManager {
/**
* 收集授权配置
* List:有顺序要求
*/
@Autowired
private List<AuthorizeConfigProvider> authorizeConfigProviders;
@Override
public void config(ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry config) {
// 除了实现AuthorizeConfigProvider/AuthorizeConfigProvider配置的
for (AuthorizeConfigProvider authorizeConfigProvider : authorizeConfigProviders) {
authorizeConfigProvider.config(config);
}
// 其余请求都要认证
// config.anyRequest().authenticated();
}
}
5. Actualice WebSecurityConfig:
@Autowired
private AuthorizeConfigManager authorizeConfigManager;
...
// // 对任何请求授权
// .authorizeRequests()
// // 匹配页面授权所有权限
// .antMatchers(
// // API
// "/swagger-ui.html",
// // 默认登录页
// SecurityConstants.DEFAULT_UNAUTHENTICATION_URL,
// // 自定义登录页(demoLogin)
// securityProperties.getBrowser().getLoginPage(),
// // 验证码
// SecurityConstants.DEFAULT_VALIDATE_CODE_URL_PREFIX + "/*",
// securityProperties.getBrowser().getSignUpUrl(),
// securityProperties.getBrowser().getSession().getSessionInvalidUrl(),
// securityProperties.getBrowser().getSignOutUrl(),
// "/user/regist")
// .permitAll()
// // 角色权限,可以指定请求方法和路径匹配
// .antMatchers(HttpMethod.POST,"/user/*").hasRole("ADMIN")
// // 任何请求
// .anyRequest()
// // 都需要被认证
// .authenticated()
// .and()
// 请求伪造防护功能关闭
.csrf().disable();
// 将拦截配置交给authorizeConfigManager处理
authorizeConfigManager.config(http.authorizeRequests());
6. Agregue autorización de proyecto para implementar la interfaz de configuración de autorización AuthorizeConfigProvider:
/**
* 项目授权配置
*
* @author zhaohaibin
*/
@Component
public class MyAuthorizeConfigProvider implements AuthorizeConfigProvider {
@Override
public void config(ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry config) {
config.antMatchers("/user").hasRole("ADMIN");
}
}
Solucionar problemas:
自行实现无权访问界面