spring security系列(一)

初识spring security

概念

Spring Security是spring采用AOP思想,基于servlet过滤器实现的安全框架。它提供了完善的认证机制和方法级的授权功能。是一款非常优秀的权限管理框架。

案例

  1. 新建项目
    新建项目
  2. 添加测试接口

@RestController
public class HelloController {
    @GetMapping("/hello")
    public String hello() {
        return "hello";
    }
}
  1. 启动项目
    启动项目

  2. 使用配置文件修改用户名密码

spring.security.user.name=admin
spring.security.user.password=123
  1. 使用代码配置用户名密码
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Bean
    PasswordEncoder passwordEncoder() {
        return NoOpPasswordEncoder.getInstance();
    }
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
                .withUser("javaboy.org")
                .password("123").roles("admin");
    }
}
①首先我们自定义 SecurityConfig 继承自 WebSecurityConfigurerAdapter,重写里边的 configure 方法。
②首先我们提供了一个 PasswordEncoder 的实例,因为目前的案例还比较简单,因此我暂时先不给密码进行加密,所以返回 NoOpPasswordEncoder 的实例即可。
③configure 方法中,我们通过 inMemoryAuthentication 来开启在内存中定义用户,withUser 中是用户名,password 中则是用户密码,roles 中是用户角色。
④如果需要配置多个用户,用 and 相连。
and相当于结束一层配置,开启新的配置
  1. 自定义登录页面
//创建一个SecurityConfig 类,重写它的 configure(WebSecurity web) 和 configure(HttpSecurity http) 方法
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Bean
    PasswordEncoder passwordEncoder() {
        return NoOpPasswordEncoder.getInstance();
    }
    /**
    * 代码配置用户名和密码
    */
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
                .withUser("javaboy.org")
                .password("123").roles("admin");
    }
    /**
    * 忽略js、css这些信息,不在检查权限
    */
	@Override
	public void configure(WebSecurity web) throws Exception {
	    web.ignoring().antMatchers("/js/**", "/css/**","/images/**");
	}
	/**
	* 配置登录页面
	*/
	@Override
	protected void configure(HttpSecurity http) throws Exception {
	    http.authorizeRequests()
	            .anyRequest().authenticated()
	            .and()
	            .formLogin()
	            //配置了loginPage代表着登录页面和接口都是,除非自己定义
	            .loginPage("/login.html")
	            //自己配置登录接口
	            .loginProcessingUrl("/doLogin")
	            //定制参数名称,不用系统的username和password,同时前端页面也需要改成相对应的参数名
	            .usernameParameter("user")
                .passwordParameter("pass")
                //登录回调--登录成功后跳转这里是前后端不分离
                	//服务端跳转
                	//登录成功后,跳转index接口,无论从哪里跳转到登录都会到这个接口,并不会记录登录之前接口位置
                .successForwardUrl("/index")
                	//重定向--页面地址会改变成对应接口地址,使用起来与上边二选一
                .defaultSuccessUrl("/index")
                //登录失败
                	//服务端跳转
                .failureForwardUrl()
                	//重定向
                .failureUrl()
	            .permitAll()
	            .and()
                .logout()
                //默认注销的 URL 是 /logout,是一个 GET 请求,我们可以通过 logoutUrl 方法来修改默认的注销 URL。
                //.logoutUrl("/logout")
                //logoutRequestMatcher 方法不仅可以修改注销 URL,还可以修改请求方式,实际项目中,这个方法和 logoutUrl 任意设置一个即可。
                .logoutRequestMatcher(new AntPathRequestMatcher("/logout","POST"))
                //logoutSuccessUrl 表示注销成功后要跳转的页面。
                .logoutSuccessUrl("/login?logout")
                //deleteCookies 用来清除 cookie。
                .deleteCookies()
                //clearAuthentication 和 invalidateHttpSession 分别表示清除认证信息和使 HttpSession 失效,默认可以不用配置,默认就会清除。
                .clearAuthentication(true)
                .invalidateHttpSession(true)
                .permitAll()
	            .and()
	            .csrf().disable();
	}
}
1、web.ignoring() 用来配置忽略掉的 URL 地址,一般对于静态文件,我们可以采用此操作。
2、如果我们使用 XML 来配置 Spring Security ,里边会有一个重要的标签 <http>,HttpSecurity 提供的配置方法 都对应了该标签。
authorizeRequests 对应了 <intercept-url>。
3、formLogin 对应了 <formlogin>。
4、and 方法表示结束当前标签,上下文回到HttpSecurity,开启新一轮的配置。
5、permitAll 表示登录相关的页面/接口不要被拦截。
6、最后记得关闭 csrf ,如果不关会导致页面出问题。

当我们定义了登录页面为 /login.html 的时候,Spring Security 也会帮我们自动注册一个 /login.html 的接口,这个接口是 POST 请求,用来处理登录逻辑。
登录成功回调:

	defaultSuccessUrl 有一个重载的方法,我们先说一个参数的 defaultSuccessUrl 方法。如果我们在 defaultSuccessUrl 中指定登录成功的跳转页面为 /index,此时分两种情况,如果你是直接在浏览器中输入的登录地址,登录成功后,就直接跳转到 /index,如果你是在浏览器中输入了其他地址,例如 http://localhost:8080/hello,结果因为没有登录,又重定向到登录页面,此时登录成功后,就不会来到 /index ,而是来到 /hello 页面。
	defaultSuccessUrl 还有一个重载的方法,第二个参数如果不设置默认为 false,也就是我们上面的的情况,如果手动设置第二个参数为 true,则 defaultSuccessUrl 的效果和 successForwardUrl 一致。
	successForwardUrl 表示不管你是从哪里来的,登录后一律跳转到 successForwardUrl 指定的地址。例如 successForwardUrl 指定的地址为 /index ,你在浏览器地址栏输入 http://localhost:8080/hello,结果因为没有登录,重定向到登录页面,当你登录成功之后,就会服务端跳转到 /index 页面;或者你直接就在浏览器输入了登录页面地址,登录成功后也是来到 /index。
  1. 拷贝前端代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值