Пишу веб-сервис с формой авторизации и регистрации. Есть два типа пользователей: обычные и администраторы. Есть контроллер, который отправляет на страницу администратора по заданному URL:
@Controller
public class ViewPageController {
@RequestMapping(value = "/admin", method = RequestMethod.GET)
public String sendAdminPage(){
return "AdminPage";
}
}
Но обычные пользователи также могут получить доступ к этой странице. Необходимо, чтобы на страницу администратора попадали только те, кто зашел под администратором. Есть варианты как это можно организовать? Может быть, сохранить вошедшего в систему пользователя в сеансе? (Желательно без Spring Security)
Вы используете весеннюю безопасность? если да, вы можете использовать аннотацию @PreAuthorize, чтобы ограничить доступ к определенной роли. Например, @PreAuthorize("hasRole('ROLE_ADMIN')")
простой способ определить код Aspect и 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";
}
кроме того, есть некоторые рамки безопасности Широ и пружинная безопасность
Вы можете использовать Spring Security для аутентификации и авторизации.