Spring boot+Spring Security 4配置整合实例
本例所覆盖的内容:
1.使用Spring Security管理用户身份认证、登录退出
2.用户密码加密及验证
3.采用数据库的方式实现Spring Security的remember-me功能
4.获取登录用户信息。
本例所使用的框架:
1.Spring boot
2.Spring MVC
3.Spring Security
4.Spring Data JPA
5.thymeleaf
说明:
1.本文针对采用Spring boot微框架之用户,完全采用Java config,不讨论xml配置。
2.本例代码是完整的,请勿随意删减,否则不能运行。
一、整合Spring Security
在l中加入如下片段:
<dependency>
                  <groupId>org.springframework.security</groupId>
                    <artifactId>spring-security-web</artifactId>
        </dependency>
       
        <dependency>
                    <groupId>org.springframework.security</groupId>
                  <artifactId>spring-security-config</artifactId>
          </dependency>
二、配置Spring Security
几乎所有配置都在下面这个文件中完成:
@Configuration
@EnableWebMvcSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    private CustomUserDetailsService customUserDetailsService;//code1
   
    @Autowired @Qualifier("dataSource1")
    private DataSource dataSource1; //code2
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        //允许所有用户访问//home
        http.authorizeRequests().antMatchers("/", "/home").permitAll()
        //其他地址的访问均需验证权限
        .anyRequest().authenticated()
        .and()
        .formLogin()
        //指定登录页是/login
        .loginPage("/login")       
        .permitAll()
        //登录成功后可使用loginSuccessHandler()存储用户信息,可选。
        .successHandler(loginSuccessHandler())//code3
        .and()
        .logout()
//退出登录后的默认网址是/home
        .logoutSuccessUrl("/home")
        .permitAll()
        .invalidateHttpSession(true)
        .and()
        //登录后记住用户,下次自动登录
        //数据库中必须存在名为persistent_logins的表
        //建表语句见code15
        .rememberMe()
        .tokenValiditySeconds(1209600)
        //指定记住登录信息所使用的数据源
        .tokenRepository(tokenRepository());//code4
   
    }
    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {   
//指定密码加密所使用的加密器为passwordEncoder()
//需要将密码加密后写入数据库 //code13
    auth.userDetailsService(customUserDetailsService).passwordEncoder(passwordEncoder());//code5
//不删除凭据,以便记住用户
        auth.eraseCredentials(false);       
    }
   
    // Code5----------------------------------------------
    @Bean
    public BCryptPasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder(4);
    }
springboot推荐算法    // Code4----------------------------------------------
    @Bean
    public JdbcTokenRepositoryImpl tokenRepository(){       
        JdbcTokenRepositoryImpl j=new JdbcTokenRepositoryImpl();
        j.setDataSource(dataSource1);
        return j;
    }
    // Code3----------------------------------------------
    @Bean
    public LoginSuccessHandler loginSuccessHandler(){
        return new LoginSuccessHandler();//code6
    }
}
code1----------------------------------------------
@Component
public class CustomUserDetailsService implements UserDetailsService {
    @Autowired  //数据库服务类
    private SUserService suserService;//code7
    @Override
    public UserDetails loadUserByUsername(String userName) throws UsernameNotFoundException {
        //SUser对应数据库中的用户表,是最终存储用户和密码的表,可自定义
        //本例使用SUser中的email作为用户名:
        SUser user = suserService.findUserByEmail(userName); //code8
        if (user == null) {
            throw new UsernameNotFoundException("UserName " + userName + " not found");
        }
        // SecurityUser实现UserDetails并将SUser的Email映射为username
        return new SecurityUser(user); //code9
    }
}
Code2----------------------------------------------
@Configuration
@EnableAutoConfiguration(exclude = { DataSourceAutoConfiguration.class })
public class MyConfiguration {
    @Bean
    public DataSource dataSource1() {
        org.springframework.jdbc.datasource.DriverManagerDataSource ds = new org.springframework.jdbc.datasource.DriverManagerDataSource();
        ds.setDriverClassName("sql.jdbc.Driver");
        ds.setUrl("jdbc:mysql://localhost:3306/test");
        ds.setUsername("root");
        ds.setPassword("****");
        return ds;
    }
}
Code6----------------------------------------------
//可以在这里将用户登录信息存入数据库。
public class LoginSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler{ 
   
    @Override 
    public void onAuthenticationSuccess(HttpServletRequest request
            HttpServletResponse response, Authentication authentication) throws IOException, 
            ServletException { 
      //获得授权后可得到用户信息  可使用SUserService进行数据库操作
        SUser userDetails = (SUser)authentication.getPrincipal(); 
         
        //输出登录提示信息 
        System.out.println("管理员 " + userDetails.getEmail() + " 登录"); 
       
        System.out.println("IP :"+getIpAddress(request));
             
        super.onAuthenticationSuccess(request, response, authentication); 

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。