老师请给与帮助,谢谢

来源:1-1 关于课程你需要了解的

慕仔6862748

2022-02-16

为什么实现了ReactiveAuthorizationManager后,重写的方法verify为什么没有走到,非常奇怪,请老师给与帮助,感谢了。

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.bblian.api.dao.entity.Permission;
import com.bblian.api.dao.mapper.PermissionMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpMethod;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.security.authorization.AuthorizationDecision;
import org.springframework.security.authorization.ReactiveAuthorizationManager;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.web.server.authorization.AuthorizationContext;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Mono;

import java.nio.file.AccessDeniedException;
import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;

@Slf4j
@Component
public class AuthorizationManager implements ReactiveAuthorizationManager<AuthorizationContext> {
    @Autowired
    private PermissionMapper permissionMapper;

    @Override
    public Mono<AuthorizationDecision> check(Mono<Authentication> authentication,
                                             AuthorizationContext authorizationContext) {
        ServerHttpRequest request = authorizationContext.getExchange().getRequest();
        String url = request.getPath().value();
        log.debug("请求的url: {}", url);
        String method = request.getMethod().name();
        log.debug("请求的方法: {}", method);
        if (HttpMethod.OPTIONS.name().equals(method)) {
            return Mono.just(new AuthorizationDecision(true));
        }
        //白名单判断
        LambdaQueryWrapper<Permission> qw = new QueryWrapper<Permission>().lambda();
        qw.eq(Permission::getResource, url);
        List<Permission> permissions = permissionMapper.selectList(qw);
        List<String> roles = permissions.stream().map(i -> "ROLE_" + i.getRole()).collect(Collectors.toList());
        return authentication.map(auth -> {
            Collection<? extends GrantedAuthority> authorities = auth.getAuthorities();
            for (GrantedAuthority authority : authorities) {
                String authorityAuthority = authority.getAuthority();
                if (roles.contains(authorityAuthority)) {
                    log.info(String.format("用户请求API校验通过,GrantedAuthority:{%s}  Url:{%s} ", authorityAuthority, url));
                    return new AuthorizationDecision(true);
                }
            }
            return new AuthorizationDecision(false);
        }).defaultIfEmpty(new AuthorizationDecision(false));
    }

    @Override
    public Mono<Void> verify(Mono<Authentication> authentication, AuthorizationContext object) {
        return check(authentication, object)
                .filter(d -> d.isGranted())
                .switchIfEmpty(Mono.defer(() -> {
                    String body = "当前用户没有访问权限! ";
                    return Mono.error(new AccessDeniedException(body));
                }))
                .flatMap(d -> Mono.empty());
    }
}
写回答

1回答

张勤一

2022-02-17

同学你好:

    没有走到一段逻辑代码的问题,基本上都是配置不对导致的,一点点查查配置吧。

0
1
慕仔6862748
老师, 为啥check能走到呢, ReactiveAuthorizationManager是接口,AuthorizationManager 是我的实现,其中check已经走到没问题, verity还是是用default 默认实现, 重写verity目的是没有权限访问时,使用自定义的输出, 但没有走到verity我的实现。
2022-02-17
共1条回复

Spring Cloud / Alibaba 微服务架构实战

从架构设计到开发实践,手把手实现

1241 学习 · 679 问题

查看课程