Spring-security,提供一个Controller,servicec层继承UserDetailsService接口,在提交的参数中,Spring-security默认提供的是 username,
在web.xml文件中配置
问题:为什么DelegatingFilterProxy的filter-name必须是springSecurityFilterChain?
DelegatingFilterProxy并不是真正的Filter,在其initFilterBean方法中会从WebApplicationContext根据delegate
来获取到,权限控制为USER,ADMIN
Spring-security在服务器端方法级权限控制
在服务器端我们可以通过Spring security提供的注解对方法来进行权限控制。Spring Security在方法的权限控制上
支持三种类型的注解,JSR-250注解、@Secured注解和支持表达式的注解,这三种注解默认都是没有启用的,需要
单独通过global-method-security元素的对应属性进行启用
配置文件
<security:global-method-security jsr250-annotations="enabled"/>
<security:global-method-security secured-annotations="enabled"/>
<security:global-method-security pre-post-annotations="disabled"/>
注解开启
@EnableGlobalMethodSecurity :Spring Security默认是禁用注解的,要想开启注解,需要在继承
WebSecurityConfigurerAdapter的类上加@EnableGlobalMethodSecurity注解,并在该类中将
AuthenticationManager定义为Bean。
JSR-250注解
导包
<dependency> <groupId>javax.annotation</groupId> <artifactId>jsr250-api</artifactId> <version>1.0</version> </dependency>
开启注解,用注解来控制 @RolesAllowed表示访问对应方法时所应该具有的角色
使用这个注解 得补全权限管理 @Secured("ROLE_ADMIN")
3.支持表达式的注解(推荐使用)
@PreAuthorize 在方法调用之前,基于表达式的计算结果来限制对方法的访问
PreAuthorize("#userId == authentication.principal.userId or hasAuthority(‘ADMIN’)")
判断方法参数userId的值是否等于principal中保存的当前用户的
userId,或者当前用户是否具有ROLE_ADMIN权限,两种符合其一,就可以访问该方法。
Spring-security 页面端标签控制权限
在jsp页面中我们可以使用spring security提供的权限标签来进行权限控制
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-taglibs</artifactId>
<version>version</version>
</dependency>
页面导入
<%@taglib uri="http://www.springframework.org/security/tags" prefix="security"%>
在jsp中我们可以使用以下三种标签,其中authentication代表的是当前认证对象,可以获取当前认证对象信息,例
如用户名。常用于欢迎XXX, 其它两个标签我们可以用于权限控制
<security:authentication property="" htmlEscape="" scope="" var=""/>
authorize是用来判断普通权限的,通过判断用户是否具有对应的权限而控制其所包含内容的显示
<security:authorize access="" method="" url="" var=""></security:authorize>
access: 需要使用表达式来判断权限,当表达式的返回结果为true时表示拥有对应的权限
method:method属性是配合url属性一起使用的,表示用户应当具有指定url指定method访问的权限,
method的默认值为GET,可选值为http请求的7种方法
url:url表示如果用户拥有访问指定url的权限即表示可以显示authorize标签包含的内容
var:用于指定将权限鉴定的结果存放在pageContext的哪个属性中
用于不向某些权限展示可以看到的标签