Динамическая настройка RBAC в Spring Security - PullRequest
0 голосов
/ 09 января 2019

Я использую Spring Security 5.1.2 в проекте Restful Spring MVC. Я использовал Custom Filter, Authentication Provider и т. Д. В моем проекте, который работает нормально, файл конфигурации My Security выглядит следующим образом:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private JwtAuthenticationProcessingFilter jwtAuthenticationProcessingFilter;
    @Autowired
    private JwtAuthenticationProvider jwtAuthenticationProvider;
    @Autowired
    private JwtAuthenticationEntryPoint jwtAuthenticationEntryPoint;
    @Autowired
    private JwtAccessDeniedHandler jwtAccessDeniedHandler;
    @Autowired
    private RolePermissionService rolePermissionService;

    @Bean
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) {
        auth.authenticationProvider(this.jwtAuthenticationProvider);
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http.authorizeRequests().antMatchers(AuthenticationPatternType.SKIP_PATTERN.getPattern()).permitAll();
        try {
            List<PermissionRule> permissionRules = this.rolePermissionService.permissionRules();
            for (PermissionRule p : permissionRules)
                http.authorizeRequests().antMatchers(p.getPermission()).hasAnyRole(p.getRoles().toArray(new String[0]));
        } catch (SystemException ignored) {
        }
        http.authorizeRequests().antMatchers(AuthenticationPatternType.AUTH_PATTERN.getPattern()).authenticated();

        this.jwtAuthenticationProcessingFilter.init(authenticationManagerBean());
        http.addFilterBefore(this.jwtAuthenticationProcessingFilter, UsernamePasswordAuthenticationFilter.class);

        http.exceptionHandling()
                .authenticationEntryPoint(this.jwtAuthenticationEntryPoint)
                .accessDeniedHandler(this.jwtAccessDeniedHandler);

        http.sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS);

        http.csrf().disable();
    }
}

И мой класс RolePermissionService выглядит следующим образом:

@Service
public class RolePermissionService {

    @Autowired
    private PermissionDao permissionDao;

    public List<PermissionRule> permissionRules() {
        List<PermissionEntity> permissionEntities = this.permissionDao.list();
        return permissionEntities.stream().map(PermissionRule::new)
            .collect(Collectors.toList());
    }
}

public class PermissionRule {
    private String permission;
    private List<String> roles;

    public PermissionRule(PermissionEntity permissionEntity) {
        this.permission = permissionEntity.getUrl();
        this.roles = permissionEntity.getRoles().stream().map(RoleEntity::getName)
                .collect(Collectors.toList());
    }

    // getters and setters
}

В этом проекте у меня есть таблицы ролей (rid, name), полномочий (pid, url) и rolePermission (pid, rid), в которых хранятся мои данные RBAC. Как вы можете видеть, я читаю эти данные из базы данных (класс RolePermissionService) и загружаю эти данные в объект HttpSecurity в вышеуказанном конфигурационном файле.

Теперь предположим, что есть оставшийся Api, который я хочу отредактировать в таблице rolePermission, или предположим, что есть оставшийся Api, в который я хочу добавить роль и ее разрешения во время выполнения.

В: Как я могу обновить конфигурацию безопасности, которую я могу динамически редактировать RBAC во время выполнения?

1 Ответ

0 голосов
/ 03 марта 2019

Пожалуйста, обратитесь https://github.com/liubo-tech/spring-security-rbac

@PreAuthorize("hasAuthority(T(com.example.springsecurityrbac.config.PermissionContact).USER_VIEW)")

Используется для аннотирования метода защиты. Использует сопоставление таблицы базы данных для назначения разрешений. Пожалуйста, обратитесь к репо для получения дополнительной информации

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...