Spring-Security完整版配置

package com.niugang.config;

import java.io.IOException;
import javax.servlet.ServletException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.userdetails.UserDetailsService;

import org.springframework.security.web.session.SessionInformationExpiredEvent;
import org.springframework.security.web.session.SessionInformationExpiredStrategy;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
import com.alibaba.fastjson.JSONObject;
@Configuration // 里面已经包含了@Component 所以不用再上下文中在引入入了
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
// spring自带的
@Autowired
private UserDetailsService userDetailsService;
/**
* configure(HttpSecurity)方法定义了哪些URL路径应该被保护
*/
@Override

protected void configure(HttpSecurity http) throws Exception {

http.authorizeRequests()// 该方法所返回的对象的方法来配置请求级别的安全细节
.antMatchers("/login").permitAll() // 登录页面不拦截
.antMatchers("/api/**").permitAll() // 调用api不需要拦截
.antMatchers(HttpMethod.POST, "/checkLogin").permitAll().anyRequest().authenticated()// 对于登录路径不进行拦截
.and().formLogin()// 配置登录页面
.loginPage("/login")// 登录页面的访问路径;
.loginProcessingUrl("/checkLogin")// 登录页面下表单提交的路径
.failureUrl("/login?paramserror=true")// 登录失败后跳转的路径,为了给客户端提示
.defaultSuccessUrl("/index")// 登录成功后默认跳转的路径;
.and().logout()// 用户退出操作
.logoutRequestMatcher(new AntPathRequestMatcher("/logout", "POST"))// 用户退出所访问的路径,需要使用Post方式
.permitAll().logoutSuccessUrl("/login?logout=true")/// 退出成功所访问的路径
.and().exceptionHandling().accessDeniedPage("/403")
.and()
.csrf().disable()
.headers().frameOptions()// 允许iframe内呈现。
.sameOrigin()
.and().sessionManagement()
/*如果用户在不退出登录的情况下使用用户名进行身份验证,并试图对“用户”进行身份验证,
* 那么第一个会话将被强制终止并发送到/login?expired页面。
*/
  .maximumSessions(1)
  //.expiredUrl("/login?expired=true")//如果是异步请求。无法进行页面跳转;
    //session过期处理策略

   .expiredSessionStrategy(new SessionInformationExpiredStrategy() {
@Override
public void onExpiredSessionDetected(SessionInformationExpiredEvent event) throws IOException, ServletException {
  String header = event.getRequest().getHeader("X-Requested-With");
  System.out.println("header:"+header);
 if(header!=null&&header.equals("XMLHttpRequest")){//异步请求
    JSONObject object= new JSONObject();
    object.put("resultCode", 302);
    object.put("redirectUrl", "login?expired=true");
   //返回严格的json数据
   event.getResponse().getWriter().write(object.toJSONString());
}else{
   event.getResponse().sendRedirect("/myweb/login?expired=true");
} 

}
});

}

       /**
* 忽略静态资源
*/

@Override
public void configure(WebSecurity web) throws Exception {
/*
* 在springboot中忽略静态文件路径,直接写静态文件的文件夹 springboot默认有静态文件的放置路径,如果应用spring
* security,配置忽略路径 不应该从springboot默认的静态文件开始
* 如:在本项目中,所有的js和css都放在static下,如果配置忽略路径,则不能以static开始
* 配置成web.ignoring().antMatchers("/static/*");这样是不起作用的
*/

web.ignoring().antMatchers("/themes/**", "/script/**");

}

        /**
* 配置自定义用户服务
*/
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService);
// .passwordEncoder(passwordEncoder());

}

/**
* 密码加密
*/
/*
* @Bean public BCryptPasswordEncoder passwordEncoder() { return new
* BCryptPasswordEncoder(); }
*/
}

异步请求session过期前端处理

$(document).ajaxComplete(function(event,request, settings){
var data=request.responseText;
var jsonObject=JSON.parse(data);
if(jsonObject.resultCode!=null&&jsonObject.resultCode==302)//根据服务器端返回的数据判断
   {
           window.location.href=jsonObject.redirectUrl;
   }
 });

controller修改因为加了session管理

@RequestMapping(value = "/login", method = RequestMethod.GET)
public String toLogin(ModelMap map,String paramserror ,String expired) {
if(paramserror!=null){
map.put("errorMessage", "用户名或密码错误");
}
if(expired!=null&&expired.equals("true")){
map.put("expired", "账户在其他地方登陆");
}
return "view/login";
}

这版的配置是禁用的csrf

如果要开启csrf,如何配置参考https://blog.csdn.net/niugang0920/article/details/79825570

       微信公众号: 

?

JAVA程序猿成长之路

分享资源,记录程序猿成长点滴。专注于Java,Spring,SpringBoot,SpringCloud,分布式,微服务

原文地址:https://www.cnblogs.com/niugang0920/p/12195958.html

时间: 2024-10-09 00:53:25

Spring-Security完整版配置的相关文章

CAS 与 Spring Security 3整合配置详解

一般来说,Web 应用的安全性包括用户认证(Authentication)和用户授权(Authorization)两个部分.用户认证指的是验证某个用户是否为系统中的合法主体,也就是说用户能否访问该系统.用户授权指的是验证某个用户是否有权限执行某个操作.在一个系统中,不同用户所具有的权限是不同的.比如对一个文件来说,有的用户只能进行读取,而有的用户可以进行修改.一般来说,系统会为不同的用户分配不同的角色,而每个角色则对应一系列的权限. 对于上面提到的两种应用情景,Spring Security 框

CAS Spring Security 3 整合配置(转)

一般来说, Web 应用的安全性包括用户认证( Authentication )和用户授权( Authorization )两个部分.用户认证指的是验证某个用户是否为系统中的合法主体,也就是说用户能否访问该系统.用户授权指的是验证某个用户是否有权限执行某个操作.在一 个系统中,不同用户所具有的权限是不同的.比如对一个文件来说,有的用户只能进行读取,而有的用户可以进行修改.一般来说,系统会为不同的用户分配不同的 角色,而每个角色则对应一系列的权限. 对于上面提到的两种应用情景, Spring Se

【JavaEE】SSH+Spring Security基础上配置AOP+log4j

Spring Oauth2大多数情况下还是用不到的,主要使用的还是Spring+SpringMVC+Hibernate,有时候加上SpringSecurity,因此,本文及以后的文章的example中都不会包含oauth2的配置,需要的话把前文的applicationContext-security.xml和pom.xml加上就可以了,本文在“SSH+Spring Security搭建方法及example”一文的基础上做一些调整,主要内容是:配置Spring AOP并且用log4j来记录日志.

springboot application.properties 常用完整版配置信息

从springboot官方文档中扒出来的,留存一下以后应该会用到 # =================================================================== # COMMON SPRING BOOT PROPERTIES # # This sample file is provided as a guideline. Do NOT copy it in its # entirety to your own application. ^^^ # ==

Spring security oauth2最简单入门环境搭建

关于OAuth2的一些简介,见我的上篇blog:http://wwwcomy.iteye.com/blog/2229889 PS:貌似内容太水直接被鹳狸猿干沉.. 友情提示 学习曲线:spring+spring mvc+spring security+Oauth2基本姿势,如果前面都没看过请及时关闭本网页. 我有信心我的这个blog应该是迄今为止使用spring security oauth2最简单的hello world app介绍了,如果你下下来附件源码还看不懂,请留言.. 其他能搜到的如h

<Web> spring security翻译

第一步就是创建java配置,配置就是创建一个Servlet Filter,也就是springSecurityFilterChain,它负责处理应用中的所有spring security事物(保护url,验证用户名密码,重定向到登录表单).configureGlobal方法名不重要,重要的是需要在有@EnableWebSecurity.@EnableGlobalMethodSecurity.@EnableGlobalAuthentication等注解的类下配置AuthenticationManag

Spring Security OAuth2 Demo -- good

1. 添加依赖授权服务是基于Spring Security的,因此需要在项目中引入两个依赖: <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-security</artifactId> </dependency> <dependency> <groupId>org.springf

spring security 1

首先我们为Spring Security专门建立一个Spring的配置文件,该文件就专门用来作为Spring Security的配置.使用Spring Security我们需要引入Spring Security的NameSpace. <beans xmlns="http://www.springframework.org/schema/beans" xmlns:security="http://www.springframework.org/schema/securit

继续说说spring security之并发控制(Concurrency Control)

定义,作用,说明: Concurrency Control:并发控制,主要用于避免同一用户多次登录,重复登录以及包括相关的session管理--具体官网---> 先看官网:http://docs.spring.io/autorepo/docs/spring-security/4.0.0.CI-SNAPSHOT/reference/htmlsingle/#session-mgmt 官网的并发控制已经说得比较清楚,但是偏偏有人(例如我)重写了(自定义了)验证的方法,导致了失效的问题,至此,一起说说s