从零学springSecurity-身份认证_HttpForm扩展

193人浏览 / 0人评论 | 作者:kite

作者:kite

链接:http://kite.vsftp.cn:8089/article/5.index.html

声明:请尊重原作者的劳动,如需转载请注明出处


    因为目前的实际开发中一般都是采用HttpForm校验而不再采用HttpBasic,所以本次只针对HttpForm做扩展配置。

    当认证成功后springSecurity会重定向到上一次的请求地址

    针对静态资源的访问请求进行放行

        在继承自WebSecurityConfigurerAdapter的SpringSecurityConfig类内实现configure(WebSecurity web)函数

        

    /**
     * 针对静态资源放行
     * @param web
     */
    @Override
    public void configure(WebSecurity web) {
        web.ignoring().antMatchers(securityProperties.getAuthentication().getStaticPaths()); //参数为静态资源路径
        // [private String[] staticPaths = {"/dist/**","/modules/**","/plugins/**"};]
    }

 

 

    提取配置数值至application.yml配置文件实现springSecurity配置模块化

kite:
  security:
    authentication:
      loginPage: /login/page #相应页面认证(登录)的url
      loginProcessingUrl: /login/form #登录表单提交处理的url
      usernameParameter: name #登录表单提交的
      passwordParameter: pwd
      staticPaths: # 静态资源放行路径
      - /dist/**
      - /modules/**
      - /plugins/**
      loginType: REDIRECT #认证后响应的类型 JSON/REDIRECT
      # security配置
      imageCodeUrl: /code/image # 获取图像验证码地址
      tokenValiditySeconds: 604800 # 登录状态保持一个礼拜(7天)604800

创建配置文件映射类AuthenticationProperties

public class AuthenticationProperties {

    // 属性名必须和yml配置文件中的名称一样才可以
    // 设置默认属性值,如果拿不到yml配置文件的值会以以下默认值生效
    private String loginPage = "/login/page";
    private String loginProcessingUrl = "/login/form";
    private String usernameParameter = "name";
    private String passwordParameter = "pwd";
    private String[] staticPaths = {"/dist/**","/modules/**","/plugins/**"};
    private LoginResponseType loginType = LoginResponseType.REDIRECT;
    private String imageCodeUrl = "/code/image";
    private Integer tokenValiditySeconds = 604800;

    get set 函数省略
}

然后创建配置映射管理类SecurityProperties

@Component // 添加至容器
@ConfigurationProperties(prefix = "kite.security") // 映射关系配置 对应yml配置文件内的kite.security部分
public class SecurityProperties {

    // 会将yml里的kite.security.authentication的值绑定到下面的对象.
    private AuthenticationProperties Authentication;

    public AuthenticationProperties getAuthentication() {
        return Authentication;
    }

    public void setAuthentication(AuthenticationProperties authentication) {
        Authentication = authentication;
    }
}

    配置springSecurity

    注入配置对象至springSecurityConfig 配置类以方便使用

// 配置文件参数
    @Autowired
    private SecurityProperties securityProperties;

    在继承自WebSecurityConfigurerAdapter的SpringSecurityConfig类内实现configure(HttpSecurity http)函数 

    

/**
     * 资源权限配置
     * 1.被拦截的资源
     *
     * @param http
     * @throws Exception
     */
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // 配置类
        AuthenticationProperties properties = securityProperties.getAuthentication();
        //  http.httpBasic()// 使用httpBasic方式认证
        http
                .addFilterBefore(imageCodeValidateFilter, UsernamePasswordAuthenticationFilter.class)
                .formLogin()// 使用form表单方式认证
                .loginPage(properties.getLoginPage()) // 配置认证页面地址[private String loginPage = "/login/page";]
                .loginProcessingUrl(properties.getLoginProcessingUrl()) // 配置登录表单处理url,默认是/login [private String loginProcessingUrl = "/login/form";]
// 在UsernamePasswordAuthenticationFilter内springSecurity默认配置了登陆表单url 
//public UsernamePasswordAuthenticationFilter(){super(new AntPathRequestMatcher("/login", //"POST"));}
                .usernameParameter(properties.getUsernameParameter()) //需要校验的用户名属性值,默认是username[name]
                .passwordParameter(properties.getPasswordParameter()) // 需要校验的用户密码属性值,默认是password[pwd]
                .successHandler(customAuthenticationSuccessHandler)
                .failureHandler(customAuthenticationFailureHandler)
//                .and()
//                .authorizeRequests() // 授权请求
//                .antMatchers(properties.getLoginPage()
//                        , properties.getImageCodeUrl()) // 放行指定请求
//                .permitAll()// el表达式,放行请求 代表所有人都可以访问这个指定的请求
//                .antMatchers("/user").hasAuthority("sys:user")
//                .antMatchers(HttpMethod.GET,"/role").hasAuthority("sys:role")
//                .antMatchers(HttpMethod.GET,"/permission").access("hasAuthority('sys:permission') or hasAnyRole('ADMIN','ROOT')")
////                .antMatchers("/user")
////                .hasAnyRole("ADMIN","ROOT") // 设置角色会加上 ROLE_ 作为前缀,ROLE_ADMIN
////                .hasAnyAuthority("ADMIN","ROOT") // 不会拼接ROLE_作为前缀
////                .hasIpAddress("") // 限制范围内ip才可以访问
//                .anyRequest().authenticated()
                .and()
                .rememberMe()// 记住登录信息配置
                .tokenRepository(jdbcTokenRepository())// 保持登录状态
                .tokenValiditySeconds(properties.getTokenValiditySeconds())// token过期时间
                .and()
                .sessionManagement()// session管理
                .invalidSessionStrategy(invalidSessionStrategy)// session失效后的处理
                .maximumSessions(1) // 每个用户可拥有的最大session数量
                .expiredSessionStrategy(sessionInformationExpiredStrategy) // session被顶替后的处理
//                .maxSessionsPreventsLogin(true) // 当一个用户的session到达最大数,将不允许后面的登录请求
                .sessionRegistry(sessionRegistry()) // session注册,指定使用session注册器
                .and().and().logout().addLogoutHandler(customLogoutHandler) // 退出时,清除缓存的session
                .logoutUrl("/user/logout") // 自定义退出地址
        .logoutSuccessUrl(properties.getLoginPage()) // 退出后跳转的页面
        .deleteCookies("JSESSIONID") // 退出后删除指定的cookie内的数据
        ;

        http.csrf().disable(); // 关闭跨站伪造防御

        // 管理所有的授权按配置
        authorizeConfigurerManager.configure(http.authorizeRequests());
    }

 

    关于登录校验异常页面信息反馈

    springSecurity反馈的页面异常信息会存储在session中可使用

<!--页面存在error参数的情况下获取session中的异常信息来展示-->
<div th:if="${param.error}">
  <span th:text="${session.SPRING_SECURITY_LAST_EXCEPTION?.message}">***</span>
</div>

    来获取在页面展示,默认为英文展示 。 在spring_security 的核心依赖中有针对异常信息语言的映射关系处理.

     

创建ReloadMessageConfig 认证信息配置类来配置中文内容展示

/**
 * 加载认证信息配置类
 */
@Configuration
public class ReloadMessageConfig {

    @Bean
    public ReloadableResourceBundleMessageSource messageSource(){
        ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
        // 通过setBasename指定中文文件的地址 不需要添加properties文件后缀,底层会自动拼接
        messageSource.setBasename("classpath:org/springframework/security/messages_zh_CN");
        return messageSource;
    }
}

 


原创:笔记


点赞(0) 打赏

全部评论

还没有评论!