设为首页 加入收藏

TOP

Spring MVC + Security 4 初体验(Java配置版)(二)
2019-09-17 17:36:09 】 浏览:47
Tags:Spring MVC Security 体验 Java 配置
String forwardUrl)。

这里我使用了RESTful,故不需要配置服务端的转发,而是配置了另外两处:successHandler 和 failureHandler ,successHandler 方法接收一个 AuthenticationSuccessHandler 对象,认证通过之后,Spring Security 将调用该对象的 onAuthenticationSuccess 方法,类似地,failureHandler 方法接收一个 AuthenticationFailureHandler 对象,认证失败之后,将调用该对象的onAuthenticationFailure 方法。

配置完登录相关信息之后,接着配置和登出有关的信息。和配置登录表单提交地址类似,这里需要配置登出请求提交地址,这里调用logoutUrl 方法,指定登出的链接地址,该地址和前面提到的 loginProcessingUrl 都不需要自己写,这两个都是全权交由 Spring Security 来处理。当用户请求 logoutUrl 方法指定的地址时,Spring Security 将对用户执行登出操作。和前面提到的successForwardUrl 类似,这里提供了 logoutSuccessUrl 方法指定登出成功之后转发的地址。不过我用了RESTful,就不再调用此方法,而是调用 logoutSuccessHandler 传入 LogoutSuccessHandler 对象,登出成功后将调用该对象的 onLogoutSuccess 方法。

最后,配置对异常的处理 exceptionHandling ,和上面介绍的 successHandler 、 failureHandler 以及 logoutSuccessHandler 差不多,authenticationEntryPoint 接收一个 AuthenticationEntryPoint 对象,当用户请求的操作需要登录时,将抛出AuthenticationException 异常,并且将该异常传入到 AuthenticationEntryPoint 对象的 commence 方法。 
accessDeniedHandler 方法接收一个 AccessDeniedHandler 对象,该对象的 handle 方法将在权限不足时调用。

配置完这些,看 configureGlobalSecurity 方法,给 AuthenticationManagerBuilder 配置一个 UserDetailsService 对象,当用户执行登录时,Spring Security 将调用该对象的 loadUserByUsername 方法,将 username 传入此方法,根据 username 获取一个UserDetails 对象。

另外,由于不能在数据库中保存明文密码,这里对密码进行 bcrypt 加密后保存,验证密码是否正确时,需要对用户输入的明文密码进行bcrypt 加密后比较密文是否一致,故这里需要提供一个 BCryptPasswordEncoder 对象。

复制
@Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Value("${api.csrftoken}") private String csrfTokenApi; @Value("${api.login}") private String loginApi; @Value("${api.logout}") private String logoutApi; @Autowired private MyUserDetailsService userDetailsService; @Autowired private PasswordEncoder passwordEncoder; @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests().antMatchers(csrfTokenApi).permitAll() .antMatchers("/api/user/**").access("hasAuthority('USER')") .antMatchers("/api/admin/**").access("hasAuthority('ADMIN')") .antMatchers("/api/dba/**").access("hasAuthority('DBA')") .antMatchers("/api/**").fullyAuthenticated() .and().formLogin().loginProcessingUrl(loginApi) .successHandler(new RestAuthenticationSuccessHandler()) .failureHandler(new RestAuthenticationFailureHandler()) .and().logout().logoutUrl(logoutApi) .logoutSuccessHandler(new RestLogoutSuccessHandler()) .and().exceptionHandling().authenticationEntryPoint(new RestAuthenticationEntryPoint()) .accessDeniedHandler(new RestAccessDeniedHandler()); } @Autowired public void configureGlobalSecurity(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder); } @Bean public Passwo
首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇项目架构开发:异常处理及日志 下一篇项目架构开发:服务层(下)

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目