皆さんこんにちは、r.matsumotoです。
今回の記事はSpring Securityについてです。
Spring SecurityとはSpringでログイン機能などを実装する際にとても便利で、権限毎に閲覧できるページを設定出来たり、CSRF対策などもやってくるとても便利なフレームワークです。
そんな便利なSpring Securityですが私がとてもハマってしまった事があるのでそれについて詳しく書いていこうと思います。
Spring Securityの権限設定
まずSpring Securityの大まかな実装方法は、ユーザー毎に権限を持たせておきその権限をSpringConfigクラスにリクエスト毎に設定していくといった流れなのですが、実際に私がハマってしまったのが以下のようなところです。
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 |
@Configuration @EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { ... @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/admin_cost/**").hasRole("Admin") .antMatchers("/employee/**").hasRole("Admin") .anyRequest().authenticated() .and() .formLogin() .loginPage("/login") .loginProcessingUrl("/sign_in") .usernameParameter("username") .passwordParameter("password") .successForwardUrl("/login") .failureUrl("/login/error") .permitAll() .and() .logout() .logoutUrl("/logout") .logoutRequestMatcher(new AntPathRequestMatcher("/logout")) .logoutSuccessUrl("/login?logout") .permitAll(); http.csrf().ignoringAntMatchers("/nocsrf","/admin_cost"); http.csrf().ignoringAntMatchers("/nocsrf","/logout"); } ... } |
http.authorizeRequests()以下でリクエストについての設定が書かれていて、hasRole()でその権限を持つユーザーだけにリクエストを通すという処理を行っています。
私は最初hasRole()で渡している権限名をそのままユーザーの権限として使っていたのですが何故かリクエストが通らず悩んでいました。
ここでは長くなってしまうのでソースは割愛させて頂きますが原因はどうやらhasRole()メソッドが受け取った文字列の先頭に”ROLE_”を自動的に付加するらしく、この例だとユーザーの権限に”ROLE_Admin”を設定してあげるとうまくリクエストが通りました。
Spring Securityをこれから使ってみようと考えている方は良かったら参考にしてみてください。