1. 먼저 필요한 Maven을 설치합니다.
아래의 메이븐저장소에 들어가서 spring-security-core, spring-security-web, spring-security-config, pring-security-taglibs 검색하여 pom.xml에 추가합니다.
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-taglibs</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
2. web.xml 에 들어가 아래와 같이 추가합니다.
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/root-context.xml
/WEB-INF/spring/security-context.xml
</param-value>
</context-param>
<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. 로그인 창을 하나 만듭니다.
파일이름은 login.jsp로 만들었습니다.
<!-- login.jsp -->
<form action="loginProcess" method="post">
<input type="text" name="userId">
<input type="password" name="userPw">
<input type="submit" value="ok">
</form>
4. /WEB-INF/spring 폴더 밑에 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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<security:http auto-config='true' use-expressions="true">
<security:csrf disabled="true" />
<security:intercept-url pattern="/login"
access="permitAll" />
<security:intercept-url pattern="/**"
access="isAuthenticated()" />
<security:form-login login-page="/login"
username-parameter="userId" password-parameter="userPw"
login-processing-url="/loginProcess" default-target-url="/test"
authentication-failure-url="/login?failure"
always-use-default-target='true' />
<security:logout invalidate-session="true"
logout-url="/logout" logout-success-url="/login?logout" />
</security:http>
</beans>
대충 설명하자면 /login 주소는 권한이없어도 접속을 허용하겠다는 뜻이고
그 외 주소는 로그인 인증이 되어야 접속할 수 있도록 하겠다는 뜻입니다.
그 외를 알고싶으시면 use-expressions(SpEL) 을 찾아보시면 됩니다.
그리고 3번에서 만든 로그인페이지를 등록하고 3번에서 만든 각각 id, password의 name들을 지정합니다.
또한 login-proccessing-url에 3번에서 만든 action 의 주소를 입력합니다. 여기서는 loginProcess로 되어있지만 아무거나 해도됩니다.
이 login-proccessing-url은 로그인 처리를 해주는 url인데 이름만 정해주면 security 측에서 알아서 만들어주는 url으로써 이름만 정하면 따로 저희가 할 일은 없이 spring security가 로그인처리를 진행 해줍니다.
default-target-url은 로그인성공시 접속할 주소를 입력합니다.
auauthentication-failure-url 은 로그인 실패시 처리할 주소를 입력하시면 됩니다.
always-use-default-target='true' 은 로그인 성공후 default-target-url에 설정한 곳으로 갈지 선택하는 것입니다.
invalidate-session="true" logout-url="/logout" logout-success-url="/login?logout" 로그아웃 입니다. 로그아웃 경로를 저장하고 로그아웃 성공시 돌아갈 경로를 저장해주면 로그아웃이 됩니다. 이 로그아웃url 또한 security 측에서 알아서 만들어주는 url으로써 여기서 이름만 정하면 따로 저희가 만들일 없이 spring security가 알아서 로그아웃을 진행해 줍니다.
5. 그리고 위의 security-context.xml 안에 로그아웃 밑에 바로 아래와 같이 추가합니다.
<security:authentication-manager>
<security:authentication-provider
user-service-ref="loginService">
<security:password-encoder
ref="bcryptPasswordEncoder" />
</security:authentication-provider>
</security:authentication-manager>
<bean id="loginService" class="net.test.test.service.testService" />
<bean id="bcryptPasswordEncoder"
class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder" />
로그인 진행시 아이디를 가지고 비밀번호를 비교할 서비스클래스를 정하는 것입니다.
또한 데이터베이스에 비빌번호가 bcrypt로 저장되어 있을 경우 비밀번호 비교시 bcrypt로 비밀번호를 비교하기 위해 설정해줍니다.
6. 위에서 아이디를 가지고 비밀번호를 비교할 서비스를 생성합니다.
여기서 DB베이스에서 회원정보를 불러와 암호화되어있는 비밀번호를 비교하게됩니다.
public class testService implements UserDetailsService {
@Autowired
TestDAO testDAO;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
// TODO Auto-generated method stub
loginVO userVO = testDAO.selectLogin(username);
if (userVO == null) {
throw new UsernameNotFoundException("No user found with id");
}
Collection<SimpleGrantedAuthority> roles = new ArrayList<SimpleGrantedAuthority>();
roles.add(new SimpleGrantedAuthority("ROLE_USER"));
UserDetails user = new User(userVO.getId(), userVO.getPassword(), roles);
return user;
}
}
UserDetailsService라는 것을 implements합니다.
그리고 username을 통해 데이터베이스에서 회원정보를 가져오고
roles에 유저를 선택한 다음 UserDetails를 생성하여 return 만 해주면 Spring Security가 알아서 비밀번호를 데이터베이스에 있는 것과 form에서 넘어온 비밀번호를 비교하여 맞으면 로그인성공해주고 아니면 로그인실패를 해줍니다.(그냥 조회만 했을 뿐인데 알아서 다 해줌)
이렇게 bean설정과 UserDetails만 설정하면 로그인form에서 아이디하고 비밀번호를 전달한 뒤 아이디만 조회했을 뿐인데 spring security가 로그인처리까지 다 진행해줍니다.
다음 controller에서 Authentication을 통해 로그인한 정보(아이디)를 가져와 사용할 수 있습니다.
'Develop > Spring' 카테고리의 다른 글
Spring Security URL login (0) | 2021.01.22 |
---|---|
Spring Tomcat JNDI 설정 (0) | 2020.11.17 |
Spring Security Custom Filter (0) | 2020.11.09 |
Spring Mybatis + MariaDB(HikariCP) 설정 (0) | 2019.10.24 |
Spring 3 에서 4로 migration (0) | 2019.10.22 |