SpringSecurity使用

作者: 団长大人 | 来源:发表于2019-03-06 13:29 被阅读38次
    1. Spring Security简介

    SpringSecurity是基于Spring应用提供的声明式的安全保护性的框架,它可以在web请求级别的和方法调用级别处理身份和授权。他是基于AspectJ的切面经行配置的

    1. Spring Security的模块

    Spring
    Security有11个模块:ASL、切面(Aspect)、CAS、Config、Core、加密(Cryptographiy)、LDAP、OpenID、Remoting、TagLib、Web,对应Maven上的几个模块

    1. 过滤WEB请求

    Spring
    Security使用很多Filter来提供安全性能。我们使用DelegatingFilterProxy——一个特殊的Servlet
    FIlter。它会将工作为委托给Filter的实现类。只需要把这个Bean注入再Spring的上下文里就行了

    使用xml配置的话,在web.xml里配置filter就行了。我们展示在使用注解的配置。在config包下建立一个SercurtyWebInitializer类

    4dd8b01acf1b80ae24f9e4cadda73269.png

    如果只是初始化DelegatingFilterProxy的话,我们什么都不用干。这样注册之后,它都会拦截应用中的请求,并且把他委托给Id为springSecurityFilterChain的bean。springSecurityFilterChain也是一个特殊的filter,他可以连接其他filter。但是,我们并不需要知道这些Filter的细节,因为我们并不需要显式的声明springSecurityFilterChain以及和它连接的filter。

    1. 最简单的安全性配置

    使用类来配置最简单的安全性配置,然后添加到RootConfig里去

    (EnableWebMcvSecurity已经被弃用)

    462e3f1eea8410f3fef0237df08baecc.png

    当我们需要指定Web的安全细节,则需要重写WebSecurityConfigurationAdapter的一些方法,比如configure方法

    • configure(WebSecurity) 配置Security的filter链

    • configure(HttpSecurity) 配置如何通过连接器的保护

    • configure(AuthenticationManagerBuilder) 配置user-detail服务

    为了让我们的配置符合我们的要求,我们还需要配置一些东西

    • 用户储存

    • 指定哪些请求需要验证,那些请求不需要验证,以及需要的权限

    • 提供一个自定义的登录页

    处理以上的内容外,我们可能还需要有选择性的在view上显示内容

    1. 选择查询用户详细信息的服务

      1. 内存用户储存:重写configure(AuthenticationManagerBuilder)方法
    9449442ac5085a90ff34c6fcc58ac4a5.png
    1. 基于数据库的认证

    这里由于配置了MyBatis的DataSource,所以可以直接住居进来

    我们的Spring Security内部已经配置好了一些内定了SQL语句,默认的表结构如下

    user表:username password enable

    authority表:username authority

    grop表:id grip_name

    我们也可以自定义查询,用来鉴权。只需要使用Security提供的底层bean类来实现。把我们自己的实体类转换成Secu底层的user

    创建一个UserDetailsServiceImpl的Service,给出@Service标签,在继承UserDetailsService并且重写loadUserByUserName方法。在重写的这个方法里面把自己的User实体转换成Security的User实体

    38617f091b50fc5d67fea19fcb8ad4c7.png

    其中,GrantedAuthority是为了做权限控制而搞的,用一个字符串即可区分。后面就可以用它来做权限控制

    然后把这个UserDetailsServiceImpl丢给SecurityConfig做判断

    14c58cca3241435d21fc1532b4594469.png

    还有一个问题就是明文的密码储存。为了安全,我们需要给用户输入的密码进行转码

    1833c6e853a8b1c8c10b0079817b1d80.png

    LDAP认证(略过 )

    配置自定义用户的服务(略过)

    6 拦截请求

    对每个请求进行详细的安全性控制在于重载configure(HttpSecurity)方法,它为不同的url路径都有选择地应用安全性

    21b095e2f8ce93d60dfa6baaf66ed5c6.png

    首先调用的authorizeRequest方法,然后使用它返回的对象来配置各种细节。

    第一次调用的antMatchers()指定了对“/spitters/me”路径的请求进行验证;第二次则更为具体,指定了对“/spittles”的post请求进行验证,后面的anyRequest则说明了对其他的访问则是允许的。

    我们也可以使用通配符进行比对

    12c3caa40e65c7ee99182f7549e8856c.png

    antMatcher使用的是ant风格的路径匹配模式。

    Apache
    Ant样式的路径有三种通配符匹配方法(在下面的表格中列出)这些可以组合出很多种灵活的路径模式:

    58bcec455310b604b86ae4f615090b38.png

    下面列举了所有的可以进行验证的方式

    40b14c2018e84c0e8305669abcc0febf.jpg af5484b7836e0d3136f72d0155561072.jpg

    还需要注意的是,在排列这些方法的时候,需要把最具体的规则放在前面,最不具体的规则放在后面。这样不具体的规则就不会覆盖到前面的

    当一个权限不够的用户试图访问的时候,会抛出403错误

    1. 使用Spring表达式进行安全保护

    2. 强制通道的安全性

    3. 防止跨站请求

    为了防止跨站请求,一些敏感的url会需要一个token来进行防伪。它会拦截一些变化状态的请求,并且检查里面是否有这个“_csrf”域的参数并且检查是否正确

    当然我们可以禁用csrf功能,但是这样非常不推荐

    41341457f97b4a116cea40eac0cbdf1d.png cf03b4acc98a5af1549a755eaed953ec.png
    1. 认证用户

    在一开始使用什么都没有的配置的时候,SpringSecurity就会帮你配置默认的登陆界面。在配置之后,你也可以使用如下的配置来启用这个配置。它会配置在你的“/longin”路径下。使用内存登入就会把用户名密码存在内存里,可以用于测试。

    c30676549a37ef6776f51ef8ef399abd.png
    1. 添加自己自定义的登陆界面
    51eed2d56f0746bcfa59dbb084863f20.png

    我写出的例子如下

    SecurityConfig的相关方法如下

    8cf8ad405ee71c84f377720232b77b5d.png

    login.jsp中,需要注意,如果还开启csrf_token验证的话,需要在表单里面添加_csrf参数,如下

    c80c05fba14bc9a7adb8dba50a07b69d.png

    全文如下

    458658ef50090799f1f051750201909c.png
    1. 启用Remember-me功能
    0afcf24fa265b64698950d8c4fcea368.png bdef71aecc49e6e8abfdc894a92bc773.png

    这样就会储存一个cooike并且设置一小时后过期。这个cooike储存了用户名和密码,现在这个cooike的名字叫“key”

    在登陆的时候需要用用一个复选框,启用记住我功能。似乎只需要在启用的时候设置一个name是remember-me的复选框并且勾选时,就可以启用

    277af99cbe74d730e9af3c6631a4acc2.png
    1. 退出

    按照我们的配置,现在已经可以退出了,我们只需要做一个使用该功能的连接。有一种直接在配置里直接写的方法,但是我没有成功,如下:

    9774a6a1b670aa8c91f2ed1059b5cc0d.png c1880d40415c198ed325fd5f850e2e84.png

    所以我只能只能手动实现这个等出功能,创建一个等处的控制器,里面代码如下


    3ffc0676faae38a1129f6722d3265d70.png

    后来发现使用配置经行logout的配置时,在csrf功能开启的时候,只能post提交/logout并且要带有token。也就是说请求的时候不能手动输入/logout,需要使用连接,点击连接的时候传入csrf的token参数,才能登出成功.

    配置文件如下

    9774a6a1b670aa8c91f2ed1059b5cc0d.png a44614146418346f1120692c190428d7.png

    Jsp中如下

    d1d063feae78425116dc9b485540c302.png
    1. 保护视图

    Jsp的SpringSecurity标签库,跳过


    附加 Spring Boot集成Spring Security

    1. 导入Maven依赖

      在Maven中导入符合Spring Boot的启动依赖

    2e81188461417784e5b2de62b148c298.png

    这配置好启动后,访问就会让你登陆,


    082fac24e95b894dac574e7fb0746cb9.png

    用户名是user,密码会在log中显示

    278b393023dee8675e4a57cd20bf1f4e.png
    2、然后剩下的就可以创建Security Config来配置了

    相关文章

      网友评论

        本文标题:SpringSecurity使用

        本文链接:https://www.haomeiwen.com/subject/npytpqtx.html