Spring Boot Integration Pasos de la serie de seguridad y solución de problemas (quince) gestión de autorización estática

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:
自行实现无权访问界面

91 artículos originales publicados · Me gusta12 · Visitas 170,000+

Supongo que te gusta

Origin blog.csdn.net/u012382791/article/details/105285178
Recomendado
Clasificación