Spring Security 借助一系列Servlet Filter 来提供安全性功能,但是借助Spring的小技巧,我们只需要配置一个Filer就可以了,DelegatingFilterProxy是一个特殊的Servlet Filter,它本身所做的工作并不多,只是将工作委托给一个javax.servlet.Filter 的实现类,这个实现类作为一个bean注册再Spring应用的上下文中。

  如果了解过用xml配置spring security的朋友就知道,用基于xml配置Spring Security过程繁琐,而且不容易学习和入门,但是基于javaConfig和注解则大大简化了这一配置,下面我们来看看是如何用java的方式配置Spring Security

  首先我们需要配置DelegatingFilterProxy,我们只需要拓展一个新类,该类实现了WebApplicationInitializer,因此Spring会发现它并用他在Web容器中注册DelegatingFilterProxy。

  

public class SecurityWebInitializer extends AbstractSecurityWebApplicationInitializer {
}

  接下来我们需要启用Web安全性功能,也是只需要拓展一个类,Spring Security 必须配置在一个实现了WebSecurityConfigurer 的bean中,或者拓展WebSecurityConfigurerAdapter 。在Spring 应用上下文中,任何实现了WebSecurityConfigurerAdapter 的bean都可以用来配置Spring Security。常用的配置已贴上,也全都写上了对应的注释。

 

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserDetailServiceImpl userDetailService;
//对每个请求进行细粒度安全性控制的关键在于重载一下方法
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()//该方法所返回的对象的方法来配置请求级别的安全细节
.antMatchers("/login")
.permitAll()//对于登录路径不进行拦截
.antMatchers("/show").authenticated()//authenticated()表示允许过的用户访问
.and()
.formLogin()//配置登录页面
.loginPage("/login")//登录页面的访问路径
.loginProcessingUrl("/check")//登录页面下表单提交的路径
.failureUrl("/login")//登录失败后跳转的路径
.defaultSuccessUrl("/show")//登录成功后默认跳转的路径
.and()
.csrf()//启用防跨站伪请求攻击,默认启用
.and()
.logout()//用户退出操作
.logoutUrl("/logout")//用户退出所访问的路径,需要使用Post方式
.permitAll()
.logoutSuccessUrl("/login?logout=true")
.and()
.authorizeRequests()
// //定义路径保护的配置方法
// .antMatchers(HttpMethod.GET,"/admin")
// .authenticated()
.antMatchers(HttpMethod.GET,"/message/**","/object/**").hasRole("USER")
.anyRequest().permitAll()
.and()
.rememberMe()//启用记住我功能
.tokenValiditySeconds(2419200)
;
}
//配置Spring Security的Filter链
@Override
public void configure(WebSecurity web) throws Exception {
super.configure(web);
}
//配置user-detail服务
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailService)
.passwordEncoder(new StandardPasswordEncoder("53cr3t"))//密码加密方式 ;
// auth.inMemoryAuthentication() //内置用户
// .withUser("user").password("user").roles("USER");
}
}

  需要注意的有几点,如果是用xml配置的springmvc环境下,基于javaConfig和注解配置Spring Security同样适用,只需要确保Spring的上下文能够扫描到上述的两个类即可。

  如果在JSP页面下使用Spring的表单标签,该标签默认会自动添加隐藏的CSRF token标签,即防跨站伪请求攻击,如果没有使用Spring的表单标签,则需要手动添加以下标签,尤其是进行logout登出时表单提交,在Form标签内必须保护以下内容。

  

<input type="hiden"
name="${_csrf.parameterName}"
value="${_csrf.token}"}

  下面是登录页面

  

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="sf" uri="http://www.springframework.org/tags/form" %>
<html>
<head>
<title>login</title>
</head>
<body>
<sf:form action="check" method="post" commandName="user" >
用户名:<sf:input path="username"></sf:input>
password:<sf:password path="password"></sf:password>
<input id="remember_me" name="remember-me" type="checkbox">
<label for="remember_me" class="inline">Remember me</label> <input type="submit" value="提交" > </sf:form>
</body>
</html>

  登出页面

  

<%@ page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="sf" uri="http://www.springframework.org/tags/form" %>
<html>
<head>
<title>User Manager</title>
</head>
<body> <sf:form id="logoutForm" action="${ctx}/logout" method="post">
<a href="#" onclick="document.getElementById('logoutForm').submit();">注销</a>
</sf:form>
</body>
</html>

  如果我们想要配置自定义认证和授权服务,则需要实现UserDetailsService

  

public class UserDetailServiceImpl implements UserDetailsService {
private static Logger logger=Logger.getLogger(UserDetailServiceImpl.class);
@Autowired
private IUserService userService;
@Autowired
private IRoleService roleService;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
logger.info("===========授权============"); User user= null;
List<Role> role=null;
try {
user = userService.findUserByUsername(username);
role=roleService.listRoleByUserId(user.getId());
logger.info("用户角色为:"+role);
} catch (BaseException e) {
e.printStackTrace();
}
List<GrantedAuthority> list= new ArrayList<GrantedAuthority>();
list.add(new SimpleGrantedAuthority("ROLE_"+role));
org.springframework.security.core.userdetails.User authUser = new
org.springframework.security.core.userdetails.User
(user.getUsername(),user.getPassword(),list); return authUser;
}
}

  该配置将安全级别细分到角色。重写的方法传来的参数为登录的username,再通过该参数从数据库中获取用户,以及相对应的权限,最终通过 将用户、密码、权限传入并实例化org.springframework.security.core.userdetails.User ,从而授权结束。配置安全路径或者方法中的权限依据上述方法中获取并绑定的权限。至此我们就可以对路径进行安全权限保护了。

  转载请注明出处:http://www.cnblogs.com/xxzhuang/p/5960001.html  多谢合作。

更加优雅地配置Spring Securiy(使用Java配置和注解)的更多相关文章

  1. Spring完全基于Java配置和集成Junit单元测试

    要点: 配置继承WebApplicationInitializer的类作为启动类,相当于配置web.xml文件 使用@Configuration注解一个类,在类中的方式使用@Bean注解,则表名该方法 ...

  2. Spring Security基于Java配置

    Maven依赖 <dependencies> <!-- ... other dependency elements ... --> <dependency> < ...

  3. spring-security-4 (2)spring security 基于Java配置的搭建

    一.spring security的模块 搭建spring security首先我们要导入必须的jar,即maven的依赖.spring security按模块划分,一个模块对应一个jar. spri ...

  4. eclipse里面配置spring,提示java.lang.ClassNotFoundException:org.springframework.web.servlet.Dispatcher错误

    在eclipse里面创建了一个Dynamic 项目,用到spring,一直提示java.lang.ClassNotFoundException: org.springframework.web.ser ...

  5. Spring中通过java的@Valid注解和@ControllerAdvice实现全局异常处理。

    通过java原生的@Valid注解和spring的@ControllerAdvice和@ExceptionHandler实现全局异常处理的方法: controller中加入@Valid注解: @Req ...

  6. 【原创】Spring MVC项目搭建(使用Java配置)

    一.使用Intellij idea,新建maven项目,选择maven-archetype-webapp. 二.在src/main下新建文件夹,命名为java,并标注为source folder. 三 ...

  7. Spring MVC + Security 4 初体验(Java配置版)

    spring Version = 4.3.6.RELEASE springSecurityVersion = 4.2.1.RELEASE Gradle 3.0 + Eclipse Neno(4.6) ...

  8. Spring的Java配置方式—@Configuration和@Bean实现Java配置

    Java配置是Spring4.x推荐的配置方式,可以完全替代xml配置. 1.@Configuration 和 @BeanSpring的Java配置方式是通过 @Configuration 和 @Be ...

  9. Spring Boot 2.0 配置图文教程

    摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 本章内容 自定义属性快速入门 外化配置 自动配置 自定义创建 ...

随机推荐

  1. 【迁移】—Entity Framework实例详解

    好久没有在博客园更新博客了,如今都换了新公司.前段时间写了关于EF迁移的文档,今天拿出来作为这个系列的一篇吧. 一.Entity Framework 迁移命令(get-help EntityFrame ...

  2. 在Servlet中出现一个输出中文乱码的问题(已经解)。

    在Servlet中出现一个输出中文乱码的问题,已经解. @Override public void doPost(HttpServletRequest reqeust, HttpServletResp ...

  3. ubuntu bless 16字节每行

    打开Preferences配置 输入路径:/usr/share/bless/bless-16-bytes-per-row.layout 或者使用以下配置 cat /home/scue/.config/ ...

  4. GDAL 遥感图像处理后的数据保存为图像文件的实现方法

    在遥感图像处理中,GDAL库不仅能读取和处理大部分的遥感图像数据,而且还能够实现图像处理后将数据保存为图像的功能. 本文就详细介绍如何将内存中的图像数据保存为.tif格式. 首先,遥感数据处理完,保存 ...

  5. Android gradle问题解决: This app has been built with an incorrect configuration. Please configure your build for VectorDrawableCompat

    1. 问题描述: Android Studio在运行模拟器某些机型或者真机某些机型的时候发生闪退. 错误如下: Java.lang.RuntimeException: Unable to start ...

  6. 【转】ASP.NET WEB API系列教程

    from: 西瓜小强 http://www.cnblogs.com/risk/category/406988.html ASP.NET Web API教程(六) 安全与身份认证 摘要: 在实际的项目应 ...

  7. ubuntu系统中的VMware 安装win7 Ghost镜像的几个坑

    1.ghost镜像安装时要先分区 2.分区后要激活 3.VM(虚拟机安装win7 提示 :units specified don't exist, SHSUCDX can't install)解决方法 ...

  8. 三层架构与MVC &amp; 设计模式的较量

    刚刚学习了三层架构,并且正在实际应用中,但随着学习的深入,又了解到了一个叫MVC的东西,(早在设计模式中就听到过MVC,仅仅是简单查了一下什么意思.)如今正好把这三个东西放在一起聊聊. 三层 是一个分 ...

  9. 面向.Net程序员的dump分析

    背景 Dump文件是进程的内存镜像.可以把程序的执行状态通过调试器保存到dump文件中.在 Windows 系统上, dump 文件分为内核 dump 和用户态 dump 两种.前者一般用来分析内核相 ...

  10. Jenkins xcodebuild There are no schemes in workspace

    Manage Schemes... 勾选 Shared 参考:http://stackoverflow.com/questions/14368938/xcodebuild-says-does-not- ...