JCF3.0™ 공통모듈-사용자 권한 관리 가이드

From JCFWiKi

Jump to: navigation, search

그림:check.gif

  • 산출물 : JCF3.0™ 공통모듈-사용자 권한 관리 가이드
  • 작성자: 고경철
  • 작성일 : 2007/12/03
  • 버전 : 0.9
  • 개정이력 :

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 설정

spring security 컨텍스트 파일보기

[편집] 유저권한관리 모듈 설계

[편집] Business Tier

[편집] model

user,role 모델클래스 다이어그램
user,role 모델클래스 다이어그램
[편집] model-user
  • 설명
    • user에 관한 정보를 중에 대표적인 엔티티로 구성하였음.
    • 실제로 accountExpired, accountLocked, credentialsExpired을 쓰지 않으며 추가로 기능을 구현할 수 있음.
    • grantedRoles
      • user는 여러개의 롤 모델을 가질 수 있으므로 role 배열을 선언한다.
    • user모델을 직접 쓰는것 보다는 extend 해서 쓰기를 권장한다.
[편집] model-role
  • 설명
    • 롤에 대한 정보
      1. roleID
      2. role이름
      3. role설명

[편집] DAO

dao 클래스 다이어그램
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

service 클래스 다이어그램
service 클래스 다이어그램
  • Sevice-UserService
    • 사용자권한관리 대한 비즈니스 로직을 담고 있는 Service 클래스로서 아래와 같이 구현한다.

그림:forbidden.gif

  • Service에서는 saveUserRole를 통해서 내부적으로 create, update, delete를 판단함
  • 이 로직은 ui를 miplatform사용하게 될때를 가정한 것이다.
[편집] 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

userAction.java의 클래스 다이어그램
userAction.java의 클래스 다이어그램

[편집] 사용자 리스트 조회

//유저 리스트 조회	
	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]); }

String role = granted[0].getAuthority();
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"); } }

}

[편집] 유저권한관리 모듈 사용하기