Avatar
1
Young Monkeys Beginner
Young Monkeys Beginner
Xử lý anotation như kiểu @UserId nằm ở đâu
anh ơi em hỏi chút, cái đoạn mà a sử dụng anotation như kiểu @UserId, thì đoạn xử lý cho các thông tin của thằng userID này ở đâu anh nhỉ, em muốn xem xử lý của nó thì xem ở đâu ạ
  • Answer
ezyplatform
Remain: 5
1 Answer
Avatar
Young Monkeys Beginner
Nó nằm trong mã nguồn không được public của EzyPlatform, nó là thế này em ạ:
@Setter
public class WebAuthenticationInterceptor extends WebRequestInterceptor {

    @EzyAutoBind
    private WebUserService userService;

    @EzyAutoBind
    private FeatureURIManager featureUriManager;

    @EzyAutoBind
    private WebUserRoleService userRoleService;

    @EzyAutoBind
    private WebRoleFeatureService roleFeatureService;

    protected final Set<String> canBeUseUserIdUris =
        getCanBeUseUserIdUris();

    @Override
    public boolean validate(RequestArguments arguments, Method handler) {
        String accessToken = arguments.getHeader(COOKIE_NAME_ACCESS_TOKEN);
        if (accessToken == null) {
            accessToken = arguments.getCookieValue(COOKIE_NAME_ACCESS_TOKEN);
        }
        HttpServletRequest request = arguments.getRequest();
        request.setAttribute(COOKIE_NAME_ACCESS_TOKEN, accessToken);
        arguments.setArgument(AccessToken.class, accessToken);

        Long userId = null;
        String uriTemplate = arguments.getUriTemplate();
        HttpMethod method = arguments.getMethod();
        if (requestUriManager.isAuthenticatedURI(method, uriTemplate)) {
            userId = userService.validateUserAccessToken(accessToken);
            arguments.setArgument(UserId.class, userId);
            request.setAttribute(UserId.class.getName(), userId);
        } else if (canBeUseUserIdUris.contains(uriTemplate)) {
            userId = userService.getUserIdByAccessToken(
                accessToken
            );
            arguments.setArgument(UserId.class, userId);
            request.setAttribute(UserId.class.getName(), userId);
        }
        if (userId != null && needToCheckPermission()) {
            UserRolesProxy userRolesProxy = checkPermission(
                method,
                uriTemplate,
                userId
            );
            arguments.setArgument(UserRoles.class, userRolesProxy);
        }
        return true;
    }

    protected boolean needToCheckPermission() {
        return false;
    }

    protected Set<String> getCanBeUseUserIdUris() {
        return Collections.emptySet();
    }

    private UserRolesProxy checkPermission(
        HttpMethod method,
        String uriTemplate,
        long userId
    ) {
        String feature = featureUriManager.getFeatureByURI(
            method,
            uriTemplate
        );
        Set<Long> roleIds = userRoleService.getRoleIdsByUserId(userId);
        Map<Long, Map<String, Map<String, Set<HttpMethod>>>> methodsUriMapByFeatureByRoleId =
            roleFeatureService.getMethodsUriMapByFeatureByRoleId();
        if (feature != null) {
            boolean hasPermission = false;
            for (Long roleId : roleIds) {
                Map<String, Map<String, Set<HttpMethod>>> methodsUriMapByFeature =
                    methodsUriMapByFeatureByRoleId.get(roleId);
                if (methodsUriMapByFeature != null) {
                    Map<String, Set<HttpMethod>> methodsUriMap =
                        methodsUriMapByFeature.get(feature);
                    if (methodsUriMap != null) {
                        Set<HttpMethod> methods = methodsUriMap.get(uriTemplate);
                        if (methods != null && methods.contains(method)) {
                            hasPermission = true;
                            break;
                        }
                    }
                }
            }
            if (!hasPermission) {
                throw new HttpForbiddenException(
                    singletonMap("permission", "denied")
                );
            }
        }
        return UserRolesProxy.create(
            roleIds,
            featureUriManager,
            methodsUriMapByFeatureByRoleId
        );
    }
}
  • 1
  • Reply