Как ограничить доступ к контроллеру Spring MVC - PullRequest
1 голос
/ 03 июля 2019

Я пишу веб-сервис с формой авторизации и регистрации. Существует два типа пользователей: обычный и администратор. Есть контроллер, который отправляет на страницу администратора по заданному URL:

@Controller
public class ViewPageController {
    @RequestMapping(value = "/admin", method = RequestMethod.GET)
    public String sendAdminPage(){
        return "AdminPage";
    }
}

Но обычные пользователи также могут получить доступ к этой странице. Необходимо, чтобы только те, кто вошел в систему как администратор, попали на страницу администратора. Есть варианты, как это можно организовать? Может быть, сохранить вошедшего в систему пользователя в сеансе? (Желательно без Spring Security)

1 Ответ

0 голосов
/ 03 июля 2019

простой способ определить код Aspect и A annotation.some, например:

@Inherited
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Authorize {

//
String[] value() default {};

}

AuthorizationAspect.java

@Slf4j
@Aspect
@Component
@RequiredArgsConstructor
public class AuthorizationAspect {

private final AuthorizationService authorizationService;

private final CacheUtil cacheUtil;

private static final String PRE = "AUTH";

@Before("@annotation(com.jin.learn.config.security.Authorize)")
public void checkPermission(JoinPoint joinPoint) {
    HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();

    Long accountId = JWTUtil.getUserIdFromRequest(request);
    Set<String> authorization = cacheUtil.getAllSet(PRE + accountId);
    if(authorization==null){
        authorization = authorizationService.findByAccountId(accountId);
        cacheUtil.save(PRE + accountId, authorization);
    }
    Authorize authorize = ((MethodSignature) joinPoint.getSignature()).getMethod().getAnnotation(Authorize.class);
    String[] needAuthorization = authorize.value();
    if (needAuthorization.length == 0)  return;
    if (authorization!=null && !authorization.isEmpty()) {
        if (!authorization.containsAll(Arrays.asList(needAuthorization))){

            throw new SystemException(ExceptionCode.NO_PERMISSION);
        }
    } else {
        throw new SystemException(ExceptionCode.NO_PERMISSION);
    }
 }
}

использовать вот так

@Authorize(value="needRight")
@RequestMapping(value = "/admin", method = RequestMethod.GET)
public String sendAdminPage(){
    return "AdminPage";
}

кроме того, есть некоторые рамки безопасности shiro и spring-security

...