欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SpringSecurity

程序员文章站 2024-03-26 09:14:23
...

放行首页和静态资源

/Security/src/main/java/com/atguigu/security/config/WebAppSecurityConfig.java中重写父类的configure(HttpSecurity security)方法

  • 默认的:所有请求都需要认证
protected void configure(HttpSecurity security) throws Exception {
	logger.debug("Using default configure(HttpSecurity). If subclassed this will potentially override subclass configure(HttpSecurity).");

	security
		.authorizeRequests()
			.anyRequest().authenticated()	//所有请求都需要进行认证
			.and()
			.formLogin()
			.and()
			.httpBasic();
}
  • 重新:设置需要放行的jsp和url
@Override
protected void configure(HttpSecurity security) throws Exception {
    //super.configure(security); 注释掉将取消父类方法中的默认规则
    
    security.authorizeRequests()        //对请求进行授权
            .antMatchers("/layui/**","/index.jsp")   //使用ANT风格设置要授权的URL地址
            .permitAll()                //允许上面使用ANT风格设置的全部请求
            .anyRequest()               //其他未设置的全部请求
            .authenticated();           //需要认证
}

效果:除了登录页面外,其他页面:
SpringSecurity

未授权请求跳转到登录页面

@Override
protected void configure(HttpSecurity security) throws Exception {
    //super.configure(security); 注释掉将取消父类方法中的默认规则
    
    security.authorizeRequests()        //对请求进行授权
            .antMatchers("/layui/**","/index.jsp")   //使用ANT风格设置要授权的URL地址
            .permitAll()                //允许上面使用ANT风格设置的全部请求
            .anyRequest()               //其他未设置的全部请求
            .authenticated()            //需要认证
            .and()
            .formLogin()                //设置未授权请求跳转到登录页面
            .loginPage("/index.jsp")      //指定登录页
            .permitAll();               //为登录页设置所有人都可以访问
}

指定登录页前后SpringSecurity登录地址变化:
SpringSecurity

效果:无论进行任何请求,都会跳转到登录页面上

通过调用loginProcessingUrl()方法指定登录地址。

设置登录系统的账号、密码

页面设置

给index.jsp设置表单

<p>${SPRING_SECURITY_LAST_EXCEPTION.message}</p>
<form action="${pageContext.request.contextPath }/index.jsp" method="post">
<!-- 防止跨站请求伪造以及表单重复提交 -->
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
……
</form>

※提示:如果希望在指定登录页面地址后指定登录操作本身地址,可以调用loginProcessingUrl(“登录地址”).permitAll()方法。

注意:要取消页面的“假”提交
SpringSecurity

后端配置

1、设置登录成功后默认前往的页面: .defaultSuccessUrl("/main.html");

2、账号、密码的请求参数名:要么修改页面上的表单项的name属性值,要么修改配置。如果修改配置可以调用usernameParameter()和passwordParameter()方法

默认账号的请求参数名:username
默认密码的请求参数名:password
SpringSecurity

3、重新另外一个父类的方法,来设置登录系统的账号密码

	@Override
	protected void configure(AuthenticationManagerBuilder builder) throws Exception {
	    //super.configure(auth); 一定要禁用默认规则
	    
	    builder.inMemoryAuthentication()
	           .withUser("tom").password("123123")  //设置账号密码
	           .roles("ADMIN")                      //设置角色
	           .and()
	           .withUser("jerry").password("456456")//设置另一个账号密码
	           .authorities("SAVE","EDIT");         //设置权限
	}

Cannot pass a null GrantedAuthority collection问题是由于没有设置roles()或authorities()方法导致的。

用户注销

理论

通过调用HttpSecurity对象的一系列方法设置注销功能。

  • logout()方法:开启注销功能
  • logoutUrl()方法:自定义注销功能的URL地址

如果CSRF功能没有禁用,那么退出请求必须是POST方式。如果禁用了CSRF功能则任何请求方式都可以。

  • logoutSuccessUrl()方法:退出成功后前往的URL地址
  • addLogoutHandler()方法:添加退出处理器
  • logoutSuccessHandler()方法:退出成功处理器

前端

SpringSecurity

后端

SpringSecurity

基于角色进行访问控制

通过HttpSecurity对象设置资源的角色要求

SpringSecurity
蓝色代码设置范围更大
红色代码设置范围相对小
如果蓝色代码先调用,会把后面红色代码的设置覆盖,导致红色代码无效。所以要先做具体小范围设置,再做大范围模糊设置。

通过AuthenticationManagerBuilder对象设置用户登录时具备的角色

SpringSecurity
是什么权限,就只能访问相应资源,如果没有权限,就会看到403界面
SpringSecurity

自定义403错误页面

HttpSecurity对象.exceptionHandling().accessDeniedPage("/to/no/auth/page.html");
SpringSecurity