Spring Security基于xml配置

引入坐标
在这里插入图片描述

web.xml配置

  •  	配置spring secruity 过滤器
    
  •  	![](https://img-blog.csdnimg.cn/20200721160626265.png)
    

    注意这里的filter-name 必须是这个名字
    配置Spring Listenter
    在这里插入图片描述
    配置SpringMVC 前端控制器
    在这里插入图片描述
    配置spring-security.xml

    auto-config=“true” 配置框架提供的默认登陆页面。
    use-expressions=“true” 配置开启SPEL表达式。
    intercept-url pattern="/**" 代表拦截的规则 这里代表拦截所有。
    access=“hasAnyRole(‘ROLE_USER’,‘ROLE_ADMIN’)” 代表访问的用户应该有什么样的角色才能访问 否则就会爆 403 的错误代表权限不足。
    form-login 中主要配置登陆跳转页面
    login-page:代表自定义登陆页面。
    login-processing-url:登陆请求拦截的url,也就是form表单提交的action。
    default-target-url:登陆成功后访问的页面。
    authentication-failure-url:登陆认证失败后跳转的页面。
    authentication-success-forward-url:登陆成功后转发的页面。

    关于csrf跨域攻击这一项在这里我们先选择关闭。
    在下一项配置了登陆用户的退出,并且在退出后清除session
    invalidate-session=“true”:代表清除session。
    logout-url="/logout" 代表退出url。
    logout-success-url="/login.jsp" 代表退出后跳转的页面。

配置需要放行的资源
在这里插入图片描述
直接切换成数据库中用户密码的配置并且配置密码的加密类这里我们采用bcryp加密 也是推荐的加密方式。
在这里插入图片描述
user-service-raf= “userService” 配置的业务类bean我们要在这里进行一些验证,而至于Controller 我们交给springsecurity ,由他决定我们页面的跳转。

开始配置我们的service
首先建立接口这里我们要继承 UserDetailsService类重写loadUserByUsername方法 并且在这个方法中写我们的验证
在这里插入图片描述
接口实现类
在这里插入图片描述
这里的User类并不是我们自己定义的用户对象,而是springsecurity 中UserDetails接口的实现类,可以认为是封装了用户的登陆信息,
在这里插入图片描述在源码中物品们可以看到这里的password和username 就是我们登陆的用户名称和密码,所以我们在表单中提交的input name值 就只能为password 和username ,accountNonExpired 代表账户是否过期,
accountNonLocked 代表账户是否被锁定,credentialsNonExpired代表认证是否过期,enabled 代表账户是否可用。
所以我们在创建User类时在他的构造方法中我们去传这几个值,在这里我除了验证了用户是否可用意外,其他的都默认写的是true,User构造函数中还有最后一个参数他是一个Collection<? extends GrantedAuthority> authorities 而GrantedAuthority是一个接口,所以我们使用他的实现类SimpleGrantedAuthority ,在这个类中封装了所有需要验证的角色,于是我们将用户相关联的角色名称查询出来封装进这个类中返回。

注意:我们这里已经使用密码的加密所以在进行新增用户的时候一定要使用在这里插入图片描述
BCryptPasswordEncoder 进行加密。
在这里插入图片描述
SpringSecurity 基于注解的权限控制
支持3中注解:
这些注解默认的都是关闭的所以要在springmvc的配置文件中添加
<security:global-method-security pre-post-annotations=“enabled”
jsr250-annotations=“enabled” secured-annotations=“enabled”/>
如若不在springMVC配置文件中添加,或是添加到了spring-security.xml中可能会出现在方法上添加注解不起作用的情况。
JSR-250注解:需要引入依赖jsr250-api
@RolesAllowed表示访问需要的角色
@RolesAllowed({“ROLE_USER”,“ROLE_ADMIN”})
只有上述两种角色的可以访问,ROLE_可以省略
@PermitAll() 表示允许所有的角色进行访问,没有权限
@DenAll() 表示不管你是谁,都不允许访问
@Secured注解:
@Secured(“ROLE_USER”) 意思基本相似
表达式注解:功能强大,不过需要学习表达式的语言
@PreAuthorize在方法执行之前进行校验
@PreAuthorize(“hasRole(‘ROLE_ADMIN’)”)
或者这样
@PreAuthorize("#userId == authentication.principal.userId or hasAuthority(‘ADMIN’)")
void changePassword(@P(“userId”) long userId ){ }
代表在方法执行之前,判断方法的参数userId是否等于principal保存的userId,或者当前登录的用户是否具有ADMIN这个角色,两者只要满足其一就可以访问。
@PostAuthorize 在方法执行之后验证,使用较少,但表达式计算结果为false 会抛出异常。
使用@PreFilter和@PostFilter可以对集合类型的参数或返回值进行过滤。使用@PreFilter和@PostFilter时,Spring Security将移除使对应表达式的结果为false的元素

@PostFilter(“filterObject.id%2==0”)
public List findAll() {
List list = new ArrayList();

  for (int i=0; i<10; i++) {
      User user= new User();
     user.setId(i);
     list .add(user);
  }
  return list ;

}
表示将id不为偶数进行剔除 而filterObject 是@PostFilter和@PreFilter的内置表达式,表示集合中的对象
@PreFilter(filterTarget=“list1”, value=“filterObject%2==0”)
public void delete(List list1, List list2 ) {
}
在使用 @PreFilter对集合进行过滤的时候我们需要使用filterTarget指定要过滤的集合

jsp 页面使用SpringSecurity 标签进行控制
需要引入:
<%@taglib prefix=“s” uri=“http://www.springframework.org/security/tags” %>
<s:authentication property=“principal.username”/> 获取当前登录的用户名称
<s:authorize access=“hasRole(‘ROLE_ADMIN’)” method=“GET” url="/user/findAll">

  • 用户管理

  • </s:authorize>
    代表 只有拥有ROLE_ADMIN 角色的用户在访问的时候这个li 才会显示
    method:请求的方式
    url:请求资源的路径.

    扫描二维码关注公众号,回复: 11515620 查看本文章

    写的不好,欢迎各位大佬点评。感激不尽!!

    猜你喜欢

    转载自blog.csdn.net/weixin_45380902/article/details/107491240
    今日推荐