그리고 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 안에 로그아웃 밑에 바로 아래와 같이 추가합니다.
또한 데이터베이스에 비빌번호가 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을 통해 로그인한 정보(아이디)를 가져와 사용할 수 있습니다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
String T;
T = br.readLine();
st = new StringTokenizer(T);
int N = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
int weight[] = new int[N + 1];
int value[] = new int[K + 1];
int dp[][] = new int[N + 1][K + 1];
for (int i = 1; i < N + 1; i++) {
T = br.readLine();
st = new StringTokenizer(T);
weight[i] = Integer.parseInt(st.nextToken());
value[i] = Integer.parseInt(st.nextToken());
}
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= K; j++) {
if (j - weight[i] >= 0) {
dp[i][j] = Math.max(dp[i - 1][j], value[i] + dp[i - 1][j - weight[i]]);
} else {
dp[i][j] = dp[i - 1][j];
}
}
}
System.out.println(dp[N][K]);
}
}