Class ScreenAccessService

java.lang.Object
com.easydesk.web.service.ScreenAccessService

@Service public class ScreenAccessService extends Object
화면(Screen) 접근 권한 검사.
  1. 화면 이름으로 Screen Attribute 의 Option 을 찾고, 그 Option 의 Artifact(Item) 에 설정된 Permission Attribute 값을 읽는다 - "이 화면에 들어오려면 필요한 권한". (findScreen(java.lang.String))
  2. SecurityContext 에 들어 있는 현재 사용자의 ACL 로 그 권한을 확인한다. (decide(java.lang.String, boolean, java.util.List<java.lang.String>, com.easydesk.security.entity.Group, java.lang.Long))
판단 규칙
  • Permission 값이 없거나 None 뿐이면 공개 화면이다 (로그인하지 않아도 허용).
  • 그 외의 화면은 로그인이 필요하다. 로그인하지 않았으면 LOGIN_REQUIRED.
  • DoNotAllowed 가 있으면 누구도 허용하지 않는다.
  • LoggedIn 은 로그인만 되어 있으면 충족된다 (어느 Role 에도 부여하지 않는 값이라 ACL 로는 확인할 수 없다).
  • 나머지 Permission 은 ACL.hasPermission(null, group, permissions) 그대로 판단한다. 즉 대상 Group 에서 사용자가 가진 Role 중 하나가 그 Permission 들을 모두 가지고 있어야 한다. AnyPermission 도 특별 취급하지 않는다.
  • EASYDESK_PERMISSION 에 없는 이름이 섞여 있으면 거부한다 (Permission Attribute 의 Option 으로만 있고 security Permission 으로 등록되지 않은 경우).
  • DB 에 등록되지 않은 화면 이름은 LoggedIn 과 같게 취급한다.
  • 검사 중 오류가 나면 허용하지 않는다 (fail closed).
대상 Group
  • URL path 에 moduleId 가 있으면 그 Module 의 Group (Module id == Group id).
  • 없으면 화면 Artifact 가 속한 Module 의 Group (현재 EASYDESK).
Permission / Group 조회는 SecurityService(moduleSecurityService) 의 PermissionManager / GroupManager 를 거친다. 화면 Artifact 를 읽는 부분만 core 의 OM 을 직접 쓴다. 화면 권한은 요청마다 DB(OM cache)에서 다시 읽는다. 따로 cache 하지 않으므로 화면 Artifact 의 Permission 을 바꾸면 다음 요청부터 바로 반영된다. Role 의 Permission 도 Role.hasPermission() 이 매번 읽으므로 바로 반영되지만, 사용자의 User-Group-Role 은 ACL 이 로그인 시점에 고정되므로 다시 로그인해야 반영된다.
  • Constructor Details

    • ScreenAccessService

      public ScreenAccessService(@Qualifier("moduleSecurityService") SecurityService moduleSecurityService)
  • Method Details

    • getRequiredPermissions

      public List<String> getRequiredPermissions(String screenName) throws TorqueException
      화면 접속에 필요한 Permission 이름들을 구한다.
      Parameters:
      screenName - Screen Attribute 의 Option 이름
      Returns:
      화면 Artifact 에 설정된 Permission 이름들. 설정된 값이 없으면 빈 list, 등록되지 않은 화면이면 null
      Throws:
      TorqueException - 조회 중 오류가 발생한 경우
    • check

      public ScreenAccess check(String screenName, Long moduleId)
      현재 요청의 사용자(SecurityContextHolder)가 화면에 접근할 수 있는지 검사한다.
      Parameters:
      screenName - Screen Attribute 의 Option 이름
      moduleId - URL path 의 moduleId. 없으면 null
      Returns:
      검사 결과