//私のコントローラクラスの一部
@RequestMapping("/login")
public String login(HttpServletRequest request,HttpServletResponse response) {
request.setAttribute("mode", "MODE_LOGIN");
return "welcomepage";
}
@RequestMapping ("/login-user")
public String loginUser(@ModelAttribute User user, HttpServletRequest request,HttpServletResponse response) {
if((userService.findByUsernameAndPassword(user.getUsername(), user.getPassword())!=null)) {
Cookie loginCookie=new Cookie("mouni","user.getUsername()");
loginCookie.setMaxAge(30*5);
response.addCookie(loginCookie);
return "homepage";
}
else {
request.setAttribute("error", "Invalid Username or Password");
request.setAttribute("mode", "MODE_LOGIN");
return "welcomepage";
}
}
私は、Javaの春ブーツ上のライブラリ管理プロジェクトを行っています。私は一つの問題を持って、私はクッキーを使用して認証を行うしたいと思います。ユーザーが自分の資格情報でログインした後、いったん簡単で、ユーザ名はクッキーの値として保存されなければなりません。ユーザがログインしようとしている次回は、彼はただのユーザー名を入力することができますし、正常にログインする必要があります。誰かが私を助けてもらえ
セキュリティは複雑な問題ですので、私が使用することをお勧め春のセキュリティをあなたはせずにそれを行うには使命を帯びているにもかかわらず、。セキュリティについての複雑さを説明するために、私はすでにあなたの現在のコードが持っていることを伝えることができ、脆弱性を、あなたの唯一の認証など、平文のユーザー名・パスワードを信頼しているので、。一方、春のセキュリティは、(あなたがキーを知っている限り)私はそれがはるかに困難偽装誰かになるように、クッキーを覚えて生成するキーを使用しています。
あなたは春のセキュリティを使用してしまうのであれば、あなたがする必要がある最初の事は作成することであるUserDetailsService
というメソッドを持っています、loadByUsername()
。これを実装するために、あなたはあなたを使用することができますUserService
し、使用User
春のセキュリティのユーザーオブジェクトを構築するビルダーを:
public class MyUserDetailsService implements UserDetailsService {
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
if ("admin".equalsIgnoreCase(username)) {
return User.builder()
.username(username)
// This should contain the hashed password for the requested user
.password("$2a$10$T5viXrOTIkraRe2mZPyZH.MAqKaR6x38L.rbmRp53yQ8R/cFrJkda")
// If you don't need roles, just provide a default one, eg. "USER"
.roles("USER", "ADMIN")
.build();
} else {
// Throw this exception if the user was not found
throw new UsernameNotFoundException("User not found");
}
}
あなたの元に反しに、注意してくださいUserService.findByUsernameAndPassword()
あなたがないではない、自分でパスワードを確認するだけで、ユーザーオブジェクトを取得し、ハッシュされたパスワードを渡す必要があります。
次のステップは、適切提供することであるPasswordEncoder
豆を。私は、次のBeanを作成したので、私の例では、私は、10の回転でbcryptのを使用しています:
@EnableWebSecurity
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder(10);
}
@Bean
public UserDetailsService userDetailsService() {
return new MyUserDetailsService();
}
}
次のステップでは、春のセキュリティを設定することです。例えば:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.antMatcher("/**")
.authorizeRequests()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login.html").permitAll()
.loginProcessingUrl("/login-user").permitAll().usernameParameter("username").passwordParameter("password")
.defaultSuccessUrl("/welcome.html")
.and()
.rememberMe()
.alwaysRemember(true)
.tokenValiditySeconds(30*5)
.rememberMeCookieName("mouni")
.key("somesecret")
.and()
.csrf().disable();
}
この場合、すべてのエンドポイントは、( /**
)に確保され、あなたは、ログインフォームがありますlogin.html
2つのフォームフィールドを含む(username
とがpassword
)。フォームの送信先がなければなりません/login-user
し、ユーザーが正常にログインしたとき、彼はにリダイレクトされます/welcome.html
。
あなたのコードで書いたものと同様に、これはと呼ばれるクッキーが生成されますmouni
値(もはや無地のユーザー名)を含むが、それはちょうどあなたの例のように、150秒間有効となります。
私は、単純なHTMLフォームを使用しているので、私はここにCSRFを無効にしていますし、そうでない場合、私はCSRFのキーを渡すためにテンプレートエンジンを追加する必要があります。理想的には、これを有効にしておく必要があります。