JCF3.0™ 공통모듈-사용자 권한 관리 가이드
From JCFWiKi
(JCF3.0™ 공통모듈-사용자 관리 가이드에서 넘어옴.)
Copyright © 2007 Daewoo Information Systems Co., Ltd. |
목차 |
[편집] 개요
[편집] 사용자 권한관리 모듈
- 본 문서는 JCF내의 공통모듈 중 하나인 사용자-권한관리에 대한 사용 가이드이다.
- 사용자-권한관리 모듈은 오픈소스인 spring security를 바탕으로 작성하였다.
- 사용자-권한관리 모듈은 다음과 같은 기능을 가진다.
- 유저에 관한 crud와 유저정보와 연계된 spring security 제반 기능 제공
- 다양한 롤에 대한 추가 및 삭제
- 롤에 따른 url 권한 맵핑
[편집] JCF 3.0에서의 개선점
- Spring Security(ver1.05)를 적용한 권한 관리
- 유저관리에서 접근id, pw 적용
- 권한에 따른 접근 가능한 url 목록을 db로 관리
[편집] 유저권한관리 모듈 설정
[편집] 테이블 생성하기
- 사용자 테이블
CREATE TABLE "SYSTEM"."JCF_USER"( USERNAME VARCHAR2(12) PRIMARY KEY NOT NULL, PASSWORD VARCHAR2(12), FIRST_NAME VARCHAR2(50), LAST_NAME VARCHAR2(50), EMAIL VARCHAR2(50), ADDRESS VARCHAR2(50), PHONE_NUMBER VARCHAR2(30), PASSWORD_HINT VARCHAR2(100), ACCOUNT_ENABLED VARCHAR2(10), ACCOUNT_EXPIRED VARCHAR2(10), ACCOUNT_LOCKED VARCHAR2(10), CREDENTIALS_EXPIRED VARCHAR2(10))
- 사용자 역할 테이블
CREATE TABLE "SYSTEM"."USER_ROLE"( USERNAME VARCHAR2(20) NOT NULL, ROLE_ID VARCHAR2(20) NOT NULL, DESCRIPTION VARCHAR2(50))
- 역할 테이블
CREATE TABLE "SYSTEM"."ROLE"( ROLE_ID VARCHAR2(20) PRIMARY KEY NOT NULL, ROLE_NAME VARCHAR2(20) NOT NULL, DESCRIPTION VARCHAR2(20) NOT NULL)
- Spring Security에서 사용하는 url_authority 테이블
CREATE TABLE "SYSTEM"."URL_AUTHORITY"( URL VARCHAR2(100) NOT NULL, AUTHORITY VARCHAR2(50) NOT NULL)
[편집] Spring security 설정
[편집] 유저권한관리 모듈 설계
[편집] Business Tier
[편집] model
[편집] model-user
- 설명
- user에 관한 정보를 중에 대표적인 엔티티로 구성하였음.
- 실제로 accountExpired, accountLocked, credentialsExpired을 쓰지 않으며 추가로 기능을 구현할 수 있음.
- grantedRoles
- user는 여러개의 롤 모델을 가질 수 있으므로 role 배열을 선언한다.
- user모델을 직접 쓰는것 보다는 extend 해서 쓰기를 권장한다.
[편집] model-role
- 설명
- 롤에 대한 정보
- roleID
- role이름
- role설명
- 롤에 대한 정보
[편집] DAO
[편집] DAO-UserDAO
- USER테이블과 ROLE 테이블, USER_ROLE 테이블에 대한 access 작업을 담당하며 iBatis로 구현한다.
- 각 메소드별 설명
- 유저관리
- public void createUser(User user) :사용자 생성
- public User findUser(String userName):사용자 이름을 인자값으로 받아 해당되는 사용자의 모든정보를 조회
- public List findAllUsers(): 등록된 모든 사용자의 정보 조회
- public void updateUser(User user): 지정된 사용자의 정보 수정
- public void deleteUser(String userName): 사용자 이름을 인자값으로 받아 해당되는 사용자를 삭제
- 유저권한관리
- public void createUserRole(User userrole): 해당 유저에 대한 롤 값을 저장
- public List findUserRole(String userName): 사용자 이름을 인자값으로 받아 해당되는 사용자의 롤을 조회
- public List findAllUserRole(): 등록된 모든 사용자의 롤을 조회
- public void updateUserRole(User userrole): 지정된 사용자의 롤 정보 수정
- public void deleteUserRole(String roleId): 해당되는 사용자의 롤 id를 인자값으로 받아 롤 삭제
- 권한관리
- public void createRole(Role role) : 권한 생성
- public List findRole() : 권한 조회
- public void updateRole(Role role) : 권한 수정
- public void deleteRole(String roleId): 권한 삭제
- 유저관리
[편집] Service
- Sevice-UserService
- 사용자권한관리 대한 비즈니스 로직을 담고 있는 Service 클래스로서 아래와 같이 구현한다.
|
[편집] Service-UserService
- 각 메소드별 설명
- 유저관리
- public abstract User findUser(String userName)
- public abstract List findAllUsers()
- public abstract void saveUser(List userList)
- 유저권한관리
- public abstract List findUserRole(String userName)
- public abstract List findAllUserRole()
- public abstract void saveUserRole(List userRoleList)
- 권한관리
- public abstract List findRole()
- public abstract void saveRole(List roleList)
- 유저관리
[편집] Presentation Tier
[편집] 사용자 리스트 조회
//유저 리스트 조회 public void listUser() {Authentication currentUser = SecurityContextHolder.getContext().getAuthentication();GrantedAuthority[] granted = (currentUser.getAuthorities());for (int i = 0; i < granted.length; i++) {System.out.println("role: " + granted[i]); }
System.out.println("userName: " + currentUser.getName());//롤에 따라 서비스 분기 for (int i = 0; i < granted.length; i++) { System.out.println(granted[i].toString());
if (granted[i].toString().equalsIgnoreCase("ROLE_ADMINISTRATOR")) {System.out.println("Action: findUser"+granted[i].toString());userList = userService.findAllUsers(); MiResponse res = new MiResponse(getResponse()); res.send(userList, "ds_user"); break; }
else if (granted[i].toString().equalsIgnoreCase("ROLE_INSA")) {System.out.println("Action: findUser");userList = userService.findAllUsers(); MiResponse res = new MiResponse(getResponse()); res.send(userList, "ds_user"); }else { System.out.println("action: findAllUsers"+ userList); user = userService.findUser(currentUser.getName()); MiResponse res = new MiResponse(getResponse()); res.send(user, "ds_user"); } }
}
