스프링 프레임워크만으로 권한
처리를 하려면 꽤 골치가 아프다.
사용자의 role을 조회해서 사용자VO에 넣어주고, 또 페이지마다 권한이 있는지 없는지 체크해줘야하고
신경써야할것이 매우 많다!
그러나 Spring
security는 로그인시 인증과 권한 처리를 도와준다.
인증이라 함은 해당 사용자가 등록된 사용자인지 아닌지를 가려주는 것을 말하고
권한 처리는 사용자의 역할별로 연결되는 페이지를 다르게 해주는 것이다.
그래서 오늘은 spring security를
이용한 login 처리를 해보도록 하겠다.
먼저 spring security의
버전을 선택해야 한다.
나의 경우에는 spring security는 3.2.6.RELEASE 버전을 사용했고
spring은 4.0.2.RELEASE 버전을 사용했다.
1. spring security 라이브러리 추가
1. pom.xml에 spring security 라이브러리를 추가한다.
1.1 dependency 추가
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>3.2.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>3.2.6.RELEASE</version>
</dependency>
1.2 dependencyManagement
추가 (충돌방지를 위하여 추가함)
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-framework-bom</artifactId>
<version>4.0.2.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
2. web.xml에 spring security 필터를 등록한다.
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
3.1
security-context.xml을 생성한다.
<?xml
version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:security="http://www.springframework.org/schema/security"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/m ··· -4.1.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/s ··· -3.2.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/b ··· eans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/c ··· -4.1.xsd">
<mvc:annotation-driven/>
<security:http
auto-config="true">
<security:intercept-url pattern="/teacher/*"
access="ROLE_USER" />
<security:form-login login-page="/login"
default-target-url="/teacher/main"
authentication-failure-url="/loginFail"/>
<security:logout logout-success-url="/logout"/>
</security:http>
<security:authentication-manager>
<security:authentication-provider user-service-ref="memberService"
/>
</security:authentication-manager>
<context:component-scan
base-package="com.spring" />
</beans>
intercept-url : 권한적용할 곳 정보
- access : 접근가능한 권한
login-page : 로그인 페이지
default-target-url
: 로그인 후 이동할 페이지
authentication-failure-url
: 로그인 실패시 이동할 페이지
logout-success-url
: 로그아웃시 이동할 페이지
3.2 web.xml의 context-param value에 security-context.xml 등록한다.
나같은 경우에는 param-value를 /WEB-INF/spring/*-context.xml 로 변경해주었다.
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/*-context.xml
</param-value>
</context-param>
4. UserDetailsService 구현
4. UserDetailsService를 구현한다.
DB에 등록된 role 정보가
ROLE_USER일 경우 ROLE_USER로, 아닌경우 ROLE_USER2로 생성하기 위하여 아래와 같이 작성하였다.
@Service
public class
MemberService implements UserDetailsService{
@Autowired
private UserDaoMapper userdao;
@Override
public UserDetails loadUserByUsername(String
username)
throws UsernameNotFoundException {
UserVO vo = userdao.findUser(username);
String userPwd = vo.getUserPwd();
String role = vo.getUserType();
System.out.println("userPwd : " +
userPwd);
System.out.println("role : " +
role);
Collection<SimpleGrantedAuthority>
roles = new ArrayList<SimpleGrantedAuthority>();
if("ROLE_USER".equals(role))
roles.add(new
SimpleGrantedAuthority("ROLE_USER"));
else
roles.add(new SimpleGrantedAuthority("ROLE_USER2"));
UserDetails user = new User(username,
userPwd, roles);
return user;
}
}
여기까지 마쳤으면 사용자
정보를 가져오기 위한 dao와 sql을 작성하고,
로그인, 로그아웃, 로그인 실패 페이지를 각각 작성해주면 spring security 적용이
완료된다.