专栏首页关忆北.Spring Security安全

Spring Security安全

安全

引入Spring Security

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

如果添加了Spring Security的依赖,那么web应用默认对所有的HTTP路径(也称为终点,端点,表示API的具体网址)使用’basic’认证。为了给web应用添加方法级别(method-level)的保护,可以添加@EnableGlobalMethodSecurity并使用想要的设置。

默认的AuthenticationManager只有一个用户('user’的用户名和随机密码会在应用启动时以INFO日志级别打印出来),如下:

Using default security password: 78fa095d-3f4c-48b1-ad50-e24c31d5cf35

这个随机生成的密码,每次启动时都会变。对登录的用户名/密码进行配置,有三种不同的方式:

  • 在 application.properties 中进行配置
  • 通过 Java 代码配置在内存中
  • 通过 Java 从数据库中加载

在配置文件中配置:

spring.security.user.name=javaboy
spring.security.user.password=123

Java 配置用户名/密码

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        //下面这两行配置表示在内存中配置了两个用户
        auth.inMemoryAuthentication()
                .withUser("javaboy").roles("admin").password("$2a$10$OR3VSksVAmCzc.7WeaRPR.t0wyCsIj24k0Bne8iKWV1o.V9wsP8Xe")
                .and()
                .withUser("lisi").roles("user").password("$2a$10$p1H8iWa8I4.CA.7Z8bwLjes91ZpY.rYREGHQEInNtAp4NzL6PLKxi");
    }
    @Bean
    PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

登录

@RestController
public class HelloController {
    @GetMapping("/hello")
    public String hello() {
        return "hello";
    }
}

创建一个 Spring Security 的配置类,集成自 WebSecurityConfigurerAdapter 类,一个http请先走filter,到达servlet后才进行拦截器的处理,如果我们把cors放在filter里,就可以优先于权限拦截器执行。

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    VerifyCodeFilter verifyCodeFilter;
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.addFilterBefore(verifyCodeFilter, UsernamePasswordAuthenticationFilter.class);
        http
        .authorizeRequests()//开启登录配置
        .antMatchers("/hello").hasRole("admin")//表示访问 /hello 这个接口,需要具备 admin 这个角色
        .anyRequest().authenticated()//表示剩余的其他接口,登录之后就能访问
        .and()
        .formLogin()
        //定义登录页面,未登录时,访问一个需要登录之后才能访问的接口,会自动跳转到该页面
        .loginPage("/login_p")
        //登录处理接口
        .loginProcessingUrl("/doLogin")
        //定义登录时,用户名的 key,默认为 username
        .usernameParameter("uname")
        //定义登录时,用户密码的 key,默认为 password
        .passwordParameter("passwd")
        //登录成功的处理器
        .successHandler(new AuthenticationSuccessHandler() {
            @Override
            public void onAuthenticationSuccess(HttpServletRequest req, HttpServletResponse resp, Authentication authentication) throws IOException, ServletException {
                    resp.setContentType("application/json;charset=utf-8");
                    PrintWriter out = resp.getWriter();
                    out.write("success");
                    out.flush();
                }
            })
            .failureHandler(new AuthenticationFailureHandler() {
                @Override
                public void onAuthenticationFailure(HttpServletRequest req, HttpServletResponse resp, AuthenticationException exception) throws IOException, ServletException {
                    resp.setContentType("application/json;charset=utf-8");
                    PrintWriter out = resp.getWriter();
                    out.write("fail");
                    out.flush();
                }
            })
            .permitAll()//和表单登录相关的接口统统都直接通过
            .and()
            .logout()
            .logoutUrl("/logout")
            .logoutSuccessHandler(new LogoutSuccessHandler() {
                @Override
                public void onLogoutSuccess(HttpServletRequest req, HttpServletResponse resp, Authentication authentication) throws IOException, ServletException {
                    resp.setContentType("application/json;charset=utf-8");
                    PrintWriter out = resp.getWriter();
                    out.write("logout success");
                    out.flush();
                }
            })
            .permitAll()
            .and()
            .httpBasic()
            .and()
            .csrf().disable();
    }
}

登录拦截

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/vercode");
    }
}
本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!
本文分享自作者个人站点/博客:https://blog.csdn.net/weixin_42313773复制
如有侵权,请联系 cloudcommunity@tencent.com 删除。
登录 后参与评论
0 条评论

相关文章

  • Spring Security 安全认证

      如果我们再配置的时候没有放行登录页等一些不需要登录就可以看到的资源,那么访问的时候就会全部拦截导致访问不到。所以我们要配置放行一些无需登录就可以看到的资源。

    Demo_Null
  • Spring Security:安全访问控制

    “ 在前面的两篇文章中,说了如何使用Spring Boot搭建Security项目以及实现自定义登录认证,今天就拿一个具体的前后端分离项目来看一下安全访问的控制...

    每天学Java
  • SpringBoot与安全(Spring Security)

    ​ SpringSecurity 是针对 Spring 项目的安全框架,也是 Spring Boot 底层安全模块的技术选项。他可以实现强大的 web 安全控制...

    OY
  • spring安全框架Security(一) 转

        现在很多企业和开发团队都使用了SSH2(Struts 2 +Spring 2.5 +Hibernate)框架来进行开发,  我们或许已经习惯了强大的Sp...

    尚浩宇
  • spring安全框架Security(二) 转

    首先是<security:authentication-manager>是指定我们自定义的身份验证策略,这里我们用customUserDetailsServ...

    尚浩宇
  • Spring Security 4 安全视图片段 使用标签(Spring Security 标签)

    原文地址: http://websystique.com/spring-security/spring-security-4-secure-view-layer...

    明明如月学长
  • Spring Security与Java应用安全保护

    Spring Security是一个强大且高度可定制的安全框架,致力于为Java应用提供身份认证和授权。

    博文视点Broadview
  • Spring Security配置内容安全策略

    在IDEA里集成阿里的https://start.aliyun.com,创建一个Spring Initializr项目:

    SmileNicky
  • 安全框架 Shiro 和 Spring Security 如何选择?

    安全框架,简单说是对访问权限进行控制,应用的安全性包括用户认证(Authentication)和用户授权(Authorization)两个部分。

    良月柒
  • ApiBoot Logging整合Spring Security安全上报日志

    ApiBoot Logging在上报日志时虽然是一般通过内网的形式部署,不过安全方面还是主要依赖于服务器的安全策略(防火墙),为了提高日志上报的安全性,ApiB...

    恒宇少年
  • Spring Security

    IoC/DI和AOP功能,为系统提供了声明式安全访问控制功能,减少了为系统安全而编写大量重复代码的工作。主要包含如下几个重要的内容:

    花落花相惜
  • Spring Security源码分析八:Spring Security 退出

    Spring Security的退出请求(默认为/logout)由LogoutFilter过滤器拦截处理。

    java干货
  • Spring boot with Spring security

    本文节选自 《Netkiller Java 手札》 地址:http://www.netkiller.cn/java/index.html 9.15. Spri...

    netkiller old
  • Spring Security源码分析一:Spring Security认证过程

    为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类

    java干货
  • Spring Security源码分析七:Spring Security 记住我

    从Cookie查询用户信息返回RememberMeAuthenticationToken

    java干货
  • Spring Security源码分析二:Spring Security授权过程

    本文是接上一章Spring Security源码分析一:Spring Security认证过程进一步分析Spring Security用户名密码登录授权是如何实...

    java干货
  • Spring Security源码分析十六:Spring Security项目实战

    java干货
  • Spring Security源码分析:Spring Security请记住我

    有这样一个场景——有个用户初访并登录了你的网站,然而第二天他又来了,却必须再次登录。于是就有了“记住我”这样的功能来方便用户使用,然而有一件不言自明的事情,那就...

    企鹅号小编
  • Spring Security 系列(2) —— Spring Security OAuth2

    OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应...

    求和小熊猫

扫码关注腾讯云开发者

领取腾讯云代金券