Spring Security with Database
Spring Security에서 이용자 인증시 데이터베이스 연동 예
데이터베이스 준비(최소한의 설정으로 데이터베이스를 이용한 인증이 실행되도록 하려면 테이블 이름이 users, authorities이어야 한다)
create table users ( username varchar(50) not null primary key, password varchar2(100) not null, enabled char(1) not null ) create table authorities ( username varchar2(50) not null, authority varchar2(50) not null ) insert into users values('smith', '1111', '1'); insert into users values('admin', '2222', '1'); insert into authorities values('admin', 'USER'); insert into authorities values('admin', 'USER_MANAGER'); insert into authorities values('smith', 'USER');
root-context.xml
<?xml version="1.0" encoding="UTF-8"?> <beans:beans xmlns="http://www.springframework.org/schema/security" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jee="http://www.springframework.org/schema/jee" xsi:schemaLocation="http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-4.1.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <beans:bean id="dataSource" class="oracle.jdbc.pool.OracleDataSource"> <beans:property name="dataSourceName" value="ds"/> <beans:property name="URL" value="jdbc:oracle:thin:@localhost:1521:xe"/> <beans:property name="user" value="scott"/> <beans:property name="password" value="TIGER"/> </beans:bean> <http auto-config='true' use-expressions="true"> <intercept-url pattern="/admin/usermanager/**" access="hasAuthority('USER_MANAGER')" /> <intercept-url pattern="/manager/**" access="hasRole('USER')" /> <intercept-url pattern="/member/**" access="isAuthenticated()" /> <intercept-url pattern="/**" access="permitAll" /> <form-login /> <logout /> </http> <authentication-manager> <authentication-provider> <jdbc-user-service data-source-ref="dataSource"/> </authentication-provider> </authentication-manager> </beans:beans>
위와같이 DataSource 만 설정해도 데이터베이스를 이용한 인증이 실행되도록 하려면 테이블 이름을 반드시 users, authorities 으로 해야 한다
위에서 access="hasRole('USER')" 으로 설정한 경우에는 DB에 저장된 권한 문자열은 "ROLE_USER" 이어야 한다
콘트롤러 클래스 없이 보안기능만 테스트하기 위해서 서블릿 설정파일에 다음과 같이 요청에 대해서 바로 뷰가 출력되도록 연결설정한다
servlet-context.xml
<view-controller path="/index" view-name="security/index" /> <view-controller path="/admin/usermanager/main" view-name="security/usermanagerMain" /> <view-controller path="/member/main" view-name="security/memberMain" /> <view-controller path="/logout" view-name="security/logout" />
권한에 따라 다른 내용을 보여주는 JSP
WEB-INF/views/security/index.jsp
<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags"%> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>INDEX</title> </head> <body> <h3>INDEX !</h3> <ul> <sec:authorize access="hasAuthority('USER_MANAGER')"> <li><a href="<c:url value='/admin/usermanager/main' />">관리자</a></li> </sec:authorize> <sec:authorize access="hasAuthority('USER')"> <li><a href="<c:url value='/member/main' />">회원 메인</a></li> </sec:authorize> <sec:authorize access="! isAuthenticated()"> <li><a href="<c:url value='/login' />">로그인</a></li> <li><a href="<c:url value='/user/join' />">회원가입</a></li> </sec:authorize> <sec:authorize access="isAuthenticated()"> <li><a href="<c:url value='/login?logout' />">로그아웃</a></li> </sec:authorize> </ul> </body> </html>
테스트 : http://IP주소:포트번호/컨텍스트명/index
위와같이 users, authorities 테이블을 사용하지 않고 임의의 테이블명, 컬럼명을 스프링 인증에 사용하려면.....
users, authorities 테이블을 사용하는 대신 임의의 테이블을 사용하고자 한다면, 다음 절차를 따르면 된다
임의의 회원 테이블(member)을 생성하고 아래처럼 기본 데이터로 채운다
user01 pwd01 홍길동 1 USER_MANAGER
user02 pwd02 최민식 1 USER_ADMIN
user03 pwd03 황정민 1 USER
user04 pwd04 강호동 1 USER
user05 pwd05 김병만 1 USER
root-context.xml 설정파일에서 <jdbc-user-service>태그의 속성을 다음과 같이 편집하여 추가한다
users-by-username-query 에 사용할 select 문장은 첫번째 컬럼이 username, 두번째 컬럼이 password, 세번째 컬럼이 enabled 에 해당하고 조건절에 반드시 파라미터(?)를 한개 사용해야 하는데 컬럼명으로는 username에 해당하는 컬럼이어야 한다
authorities-by-username-query 에 입력할 select 문장은 첫번째 컬럼이 username, 두번째 컬럼이 authority 에 해당하고 조건절에 반드시 파라미터(?) 한개를 사용해야 하는데 컬럼명은 username에 해당하는 컬럼이어야 한다
<authentication-manager> <authentication-provider> <jdbc-user-service data-source-ref="dataSource" users-by-username-query="select id, pwd, enabled from member where id=?" authorities-by-username-query="select id, authority from member where id=?"/> </authentication-provider> </authentication-manager>