前言
关于学习spring-security过程中的记录
一、Spring-Security是什么?
spring_security是一款权限框架,能方便快捷实现认证和授权控制,能与spring系列框架无缝整合。1.认证: 让程序知道你是谁,未认证则认定为匿名用户。
2.授权: 访问某些指定资源时需要的权限,比如对数据修改可指定为需要修改权限,可以设置某个角色拥有某个权限,角色和权限可以是多对多的关系
二、入门案例编写
1.导入依赖
pom.xml:
两个关键的依赖
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
2.spring-security.xml配置文件编写
编写步骤:
- 定义相关权限 security:http
1.1 开始部分设置默认 auto-config
1.2 开始表达式使用 use-expressions
1.3 为特定资源设置权限 security:intercept-url
1.4 屏蔽登录界面检测 security:csrf
1.5 自定义登入界面 security:form-login
1.6 配置登出 security:logout
<!--
http:用于定义相关权限控制
auto-config:是否自动配置
* 设置为true时框架会提供默认的一些配置,例如提供默认的登录页面、登出处理等
* 设置为false时需要显示提供登录表单配置,否则会报错
use-expressions:用于指定intercept-url中的access属性是否使用表达式
-->
<security:http auto-config="true" use-expressions="true">
<!--对哪些资源进行校验,相应资源需要的具体角色-->
<security:intercept-url pattern="/**" access="hasRole('ROLE_ADMIN')"/>
<!--
login-page:自定义的登录页面url地址
username-parameter:自定义页面中代表账号的name属性
password-parameter:自定义页面中代表密码的name属性
login-processing-url:登入提交的路径
default-target-url:认证成功后跳转的界面
authentication-failure-url:认证失败后跳转的界面
-->
<security:form-login
login-page="/login.html"
username-parameter="username"
password-parameter="password"
login-processing-url="/user/login"
default-target-url="/index.html"
authentication-failure-url="/login.html"
/>
<!--
logout-url:登出时访问的路径
logout-success-url:登出成功后跳转的页面
invalidate-session="true" :使session无效
-->
<security:logout
logout-url="/login/out"
logout-success-url="/login.html"
invalidate-session="true"/>
<!--屏蔽对登录页面的检测,使自定义的登录页面可以使用-->
<security:csrf disabled="true"/>
</security:http>
- 配置可匿名访问的资源
<!--配置可匿名访问的资源-->
<security:http security="none" pattern="/login.html"/>
<security:http security="none" pattern="/css/**"></security:http>
<security:http security="none" pattern="/js/**"></security:http>
<security:http security="none" pattern="/favicon.ico"></security:http>
- 配置认证管理器 security:authentication-manager
3.1认证提供者
3.2加密器
<!--提供用来对比认证的实例,由返回值确定-->
<bean id="userService" class="com.xxx.service.SpringSecurityUserService"/>
<!--加密器实例,将提交的密码加密后后再对比-->
<bean id="passwordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/>
<!--配置认证管理器-->
<security:authentication-manager>
<!--user-service-ref:指定认证服务提供者-->
<security:authentication-provider user-service-ref="userService">
<!--ref:指定加密器-->
<security:password-encoder ref="passwordEncoder"/>
</security:authentication-provider>
</security:authentication-manager>
- 注解驱动以及静态资源释放
<!--释放静态资源-->
<mvc:default-servlet-handler/>
<!--开启spring注解驱动-->
<context:annotation-config></context:annotation-config>
三.关于认证提供者的编写
// 如果要成为认证提供者必须实现UserDetailsService接口
public class SpringSecurityUserService implements UserDetailsService {
// 本地注入配置文件中配置的加密器对象
@Autowired
private BCryptPasswordEncoder passwordEncoder;
// 认证信息由该方法的返回值决定
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
// 手动写死密码并加密
String password = passwordEncoder.encode("admin");
// 从源码中可以看出这里需要GrantedAuthority的实现类
// 为user添加一个角色
List<GrantedAuthority> list = new ArrayList<>();
list.add(new SimpleGrantedAuthority("ROLE_ADMIN"));
// 返回认证信息
User user = new User("admin", password, list);
return user;
}
}
总结
希望下个月我还能看得懂我写了什么东西吧。