앞에서 살펴봤던 내용은 spring security에서 제공하는 권한과 인증이 도대체 무엇인지 살펴보는 작업을 해본 거고 언뜻 보기에도 문제점은 두 개가 있습니다.

우리 kimsaemERP에서 spring security가 적용되어야 하며 로그인 인증이 관리자던 사용자던 db에 있는 데이터와 비교가 되어야겠죠?

 

우선 사용자 정의 페이지를 로그인 페이지로 등록하려면 <http> 태그 내부의 하위 태그 중에 <form-login> 태그를 이용하면 됩니다.

다음과 같은 코드를 설정 파일에 추가합니다.

 

	<security:intercept-url pattern="/admin/**" access="ROLE_ADMIN"/>
	<security:intercept-url pattern="/emp/login.do" access="ROLE_ANONYMOUS,ROLE_USER,ROLE_ADMIN"/>
	<security:intercept-url pattern="/index.do" access="ROLE_ANONYMOUS,ROLE_USER,ROLE_ADMIN"/>
	<security:intercept-url pattern="/**" access="ROLE_USER"/>
	<security:form-login
			username-parameter="id"
			password-parameter="pass"
			login-page="/emp/login"
			default-target-url="/index.do"
			authentication-failure-url="/emp/login.do?fail=true"/>

 

속성에 대한 설명입니다.

① username-parameter

로그인 화면에서 사용자 아이디를 입력받는 text의 기본 name속성 값인 j_username을 다른 값으로 사용하려고 할 때 사용

 

② password-parameter

로그인 화면에서 사용자 패스워드를 입력받는 text의 기본 name속성 값인 j_password를 다른 값으로 사용하려고 할 때 사용 login.jsp에 정의한 이름으로 세팅합니다.

 

③ login-page속성

로그인 화면의 url을 지정한다.

인증을 받지 않은 사용자가 권한이 필요한 화면에 접속하려고 하면 띄워주는 화면

 

④ default-target-url

로그인 성공하면 보여줄 페이지

 

⑤ authentication-failure-url

인증이 실패하면 보여주는 화면의 url

로그인 화면을 다시 보여주고 재로그인을 유도. 파라미터 fail에 true를 지정하므로 로그인 실패 시에 보이는 것이라는 것을 알려줌

 

우리가 추가한 내용은 username과 password는 각각 login.jsp에 정의되어 있는 파라미터명을 정의하였습니다. loginPage를 보고 확인합니다.

login-page는 우리가 로그인 페이지를 볼 때 요청하는 url을 target-url은 위에서 설명한 대로 로그인 성공하면 index.do를 요청하여 실행하겠다는 의미입니다. 

 

<form-login>태그의 login-page의 속성에 path를 "/emp/login"으로 정의하였습니다. 인증을 해야 하는 상황이 되면 /emp/login으로 요청해서 실행되는 화면을 보여주겠다는 의미입니다.

이 경로는 spring security 적용하기 전에 우리가 요청하던 로그인 페이지를 실행하는 path를 정의하면 됩니다. 원래 우리 kimsaemERP의 로그인 페이지를 보기 위해 요청하던 path는 /emp/login.do 였으나. do를 없애고 /emp/login으로 변경해 보았습니다.

수업시간에 /emp/login으로 변경했기 때문에 변경한 것이니 그냥 하셔도 좋습니다.

 

그럼 일단 IndexController의 @RequestMapping의 value속성을 "/emp/login.do"에서 "/emp/login"으로 변경합니다. 

 

 

top.jsp의 요청 path도 /kimsaemERP/emp/login으로 변경합니다.

 

xml이 변경되었으므로 서버를 restart 하고 실행합니다.

kimsaemERP을 요청하면 처음부터 권한을 적용해 놓았기 때문에 다음과 같이 오류가 발생합니다. 

 

 

 

주소표시줄이 "http://localhost:8088/kimsaemERP/emp/login.do"로 바뀝니다. 이유는 우리가 설정 파일에서

<security:intercept-url pattern="/**" access="ROLE_USER" />를 설정하였기 때문입니다. 모든 요청 url이 "ROLE_USER"의 권한을 갖고 있는 사용자만 액세스 할 수 있으므로 우리가 지정한 사용자 정의 로그인 페이지를 보여주기 위해 /emp/login를 요청할 텐데 이 또한  

<security:intercept-url pattern="/**" access="ROLE_USER" />이 권한 부분에 어긋나 버리니 이것이 계속 반복되며 리다이렉션 오류가 나는 것입니다.

 

우린 이 시점에 두 가지를 생각해야 합니다. 첫 번째 페이지와 로그인 페이지는 누구나 다 접속할 수 있어야 합니다. 따라서 /index.do와 /emp/login는 인증받지 않은 모든 사용자가 접근할 수 있도록 access속성을 "ROLE_ANONYMOUS"로 지정합니다.

 

 

설정 파일에 다음과 같이 두 줄을 삽입하여 수정합니다.

<security:intercept-url pattern="/emp/login" access="ROLE_ANONYMOUS"/>

<security:intercept-url pattern="/index.do" access="ROLE_ANONYMOUS"/>

 

단, 주의하실 사항은 반드시

<security:intercept-url pattern="/**" access="ROLE_USER" /> 코드 전에 삽입하여야 합니다.

 

<?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:mvc="http://www.springframework.org/schema/mvc"
	xmlns:security="http://www.springframework.org/schema/security"
	xsi:schemaLocation="http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.2.xsd
		http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

	<security:http auto-config="true">
		<security:intercept-url pattern="/admin/**" access="ROLE_ADMIN"/>
		<security:intercept-url pattern="/emp/login.do" 
							access="ROLE_ANONYMOUS,ROLE_USER,ROLE_ADMIN"/>
		<security:intercept-url pattern="/index.do" 
							access="ROLE_ANONYMOUS,ROLE_USER,ROLE_ADMIN"/>
		<security:intercept-url pattern="/**" access="ROLE_USER"/>
		<security:form-login
			username-parameter="id"
			password-parameter="pass"
			login-page="/emp/login.do"
			default-target-url="/index.do"
			authentication-failure-url="/emp/login.do?fail=true"
		/>
	</security:http>
	<security:authentication-manager>
		<security:authentication-provider>
			<security:user-service>
				<security:user name="user" password="user"
					authorities="ROLE_USER" />
				<security:user name="admin" password="admin"
					authorities="ROLE_ADMIN" />
			</security:user-service>
		</security:authentication-provider>
	</security:authentication-manager>
</beans>

서버를 restart 하고 접속하면 첫 번째 페이지는 접속됩니다. top메뉴에서 "Login"을 선택하면 로그인 페이지는 response 됩니다.

어떤 링크를 클릭해도 지금은 권한을 부여해 놓았기 때문에 로그인 페이지만 출력됩니다. 멈춰있는 것처럼 보이지만 사실 내부에서는 요청을 받고 인증되지 않은 사용자이므로 인증을 하기 위해 우리가 정의한 로그인 페이지로 바쁘게 리다이렉트 되고 있는 것이지요.

로그인 페이지의 이미지가 깨져서 출력됩니다. css도 인식이 안 돼서 첫 번째 페이지가 깨질 수도 있습니다.

 

 

+ Recent posts