1. 스프링 시큐리티 로그인 페이지 커스텀 화, 404 에러 처리 방법
· 로그인 페이지와 404 에러 처리 이전에는 기본 설정인 login 페이지와 404 에러페이지를 반환하였지만,
로그인 페이지 커스텀 화를 통해 설정해둔 경로로 이동하여 페이지를 출력한다.
· defualt로 login/loginForm으로 설정하였기 때문에 url을 컨트롤러에 전달하고 컨트롤러에서는 jsp를 반환한다.
<security-context.xml> user 객체가 userService 정보를 로딩
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
<http>
<intercept-url pattern="/security/all" access="permitAll" />
<intercept-url pattern="/security/member" access="hasRole('ROLE_MEMBER')" />
<intercept-url pattern="/security/admin" access="hasRole('ROLE_ADMIN')" />
<!--로그인 페이지 커스텀 화 -->
<form-login login-page="/login/loginForm"
default-target-url="/"
//로그인 성공 시 url /로 이동
authentication-failure-url="/login/loginForm?error"
//잘못입력한 경우 위의 url로 이동
username-parameter="id"
password-parameter="password" />
<logout logout-url="/logout" logout-success-url="/" />
<!--404 에러 처리, 잘못된 접근의 경우 아래의 page로 이동 -->
<access-denied-handler error-page="/security/accessError"/>
</http>
<!-- provider -->
<authentication-manager>
<authentication-provider>
<user-service>
<user name="member" password="{noop}member" authorities="ROLE_MEMBER" />
<user name="manager" password="{noop}manager" authorities="ROLE_MEMBER" />
<user name="admin" password="{noop}admin" authorities="ROLE_MEMBER, ROLE_ADMIN" />
</user-service>
</authentication-provider>
</authentication-manager>
</beans:beans>
|
cs |
<HomeController.java>
1
2
3
4
5
6
7
8
9
10
11
|
@Controller
public class HomeController {
private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
@GetMapping("/login/loginForm")
public String loginForm() {
logger.info("Welcome Login Form!");
return "login/loginForm";
}
}
|
cs |
<loginForm. jsp>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
<body onload="document.f.id.focus();">
<h3>아이디와 비밀번호를 입력해주세요.</h3>
<c:url value="/login" var="loginUrl" />
<p>${loginUrl}</p>
<form:form name="f" action="${loginUrl}" method="POST">
<c:if test="${param.error != null}">
<p>아이디와 비밀번호가 잘못되었습니다.</p>
</c:if>
<c:if test="${param.logout != null}">
<p>로그아웃 하였습니다.</p>
</c:if>
<p>
<label for="username">아이디</label>
<input type="text" id="id" name="id" />
</p>
<p>
<label for="password">비밀번호</label>
<input type="password" id="password" name="password"/>
</p>
<%-- <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" /> --%>
<button type="submit" class="btn">로그인</button>
</form:form>
</body>
|
cs |
<기본 login page>
<설정한 경로, loginForm.jsp>
2. DB와 연결시키기
· 전에는 user id와 pw를 직접 설정했지만 회원을 모두 작성할 수 없으므로, DB의 정보를 불러와 조회하는 방법을 사용해야 한다.
· DB에 저장 된 id와 pw를 불러오기 위해 dataSource 객체를 생성 해야하므로, root-context.xml 설정 필수!
· JdbcDaoImpl 객체를 생성하여, user-service의 쿼리문을 실행한다. (쿼리문 미표기 시 defualt로 설정된 쿼리문 실행)
· 유저홈을 클릭했을 때 마지막 url에 설정해 둔 /**에서 통과하지 못하고, user, admin의 권한이 없다면 로그인 페이지를
반환하고, admin으로 로그인 한 경우 DB에 저장된 id와 passward가 맞다면 유저홈 페이지를 반환한다.
<security-context.xml>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
<http auto-config="true" use-expressions="true">
<intercept-url pattern="/login/loginForm" access="permitAll" />
<intercept-url pattern="/" access="permitAll" />
<intercept-url pattern="/admin/**" access="hasRole('ADMIN')" />
<intercept-url pattern="/**" access="hasAnyRole('USER, ADMIN')" />
<!--로그인 페이지 커스텀 화 -->
<form-login login-page="/login/loginForm"
default-target-url="/"
authentication-failure-url="/login/loginForm?error"
username-parameter="id"
password-parameter="password" />
<logout logout-url="/logout" logout-success-url="/" />
<!-- 403 에러 처리 -->
<access-denied-handler error-page="/login/accessDenied"/>
</http>
<beans:bean id="userDetailsService" class="org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl">
<beans:property name="dataSource" ref="dataSource"/>
</beans:bean>
<beans:bean id="customNoOpPasswordEncoder" class="edu.bit.ex.security.CustomNoOpPasswordEncoder"/>
<!-- provider -->
<authentication-manager>
<authentication-provider>
<password-encoder ref="customNoOpPasswordEncoder"/>
<jdbc-user-service
data-source-ref="dataSource"
users-by-username-query="select username, password, enabled from users where username = ?"
authorities-by-username-query="select username, authority from authorities where username = ?"
/>
</authentication-provider>
</authentication-manager>
</beans:beans>
|
cs |
※연습문제※
· emp table의 아이디를 ename으로, 비밀번호를 empno로 입력하였을 때 로그인이 이루어지고,
직업이 매니저인 사람은 관리자, 유저홈 유입이 가능하고, 그 외에 사원은 유저홈만 유입 가능하도록 프로그래밍 할 것!
<security-context.xml>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
<http auto-config="true" use-expressions="true">
<intercept-url pattern="/login/loginForm" access="permitAll" />
<intercept-url pattern="/" access="permitAll" />
<intercept-url pattern="/admin/**" access="hasRole('ADMIN')" />
<intercept-url pattern="/**" access="hasAnyRole('USER, ADMIN')" />
<!--로그인 페이지 커스텀 화 -->
<form-login login-page="/login/loginForm"
default-target-url="/"
authentication-failure-url="/login/loginForm?error"
username-parameter="id"
password-parameter="password" />
<logout logout-url="/logout" logout-success-url="/" />
<!-- 403 에러 처리 -->
<access-denied-handler error-page="/login/accessDenied"/>
</http>
<beans:bean id="userDetailsService" class="org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl">
<beans:property name="dataSource" ref="dataSource"/>
</beans:bean>
<beans:bean id="customNoOpPasswordEncoder" class="edu.bit.ex.security.CustomNoOpPasswordEncoder"/>
<!-- provider -->
<authentication-manager>
<authentication-provider>
<password-encoder ref="customNoOpPasswordEncoder"/>
<jdbc-user-service
data-source-ref="dataSource"
role-prefix=""
users-by-username-query="select ename, empno, 1 from emp where ename = ?"
authorities-by-username-query="select ename, case when job='MANAGER' then 'ROLE_ADMIN' else 'ROLE_USER' end as authority from emp where ename = ?"
/>
</authentication-provider>
</authentication-manager>
|
cs |
<구현화면_BLAKE>
<구현화면_SMITH>