Spring-Security是Spring家族的重要一员。
Spring-Security简单使用
1.简介
Spring Security是一个功能强大且高度可定制的身份验证和访问控制框架。它是保护基于spring的应用程序的实际标准。
Spring Security是一个框架,侧重于为Java应用程序提供身份验证和授权。与所有Spring项目一样,Spring安全性的真正强大之处在于它很容易扩展以满足定制需求
2. 快速入门
导入SpringSecurity依赖
1
2
3
4
5
6
7
8
9
10
11<!--其他所需依赖-->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>${spring.security.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>${spring.security.version}</version>
</dependency>在web配置文件中添加过滤器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18<!--.........-->
<!--添加spring-security配置文件的解析-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-security.xml</param-value>
</context-param>
<!--.........-->
<!--添加spring-security所需的过滤器-->
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--.........-->
</web-app>配置spring-security
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:security="http://www.springframework.org/schema/security"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security.xsd">
<!-- 配置不过滤的资源(静态资源及登录相关) -->
<security:http security="none" pattern="/login.html" />
<security:http security="none" pattern="/failer.html" />
<security:http auto-config="true" use-expressions="false" >
<!-- 对所有的路径进行权限控制,只允许ROLE_USER可以访问 -->
<security:intercept-url pattern="/**" access="ROLE_USER" />
<security:logout invalidate-session="true" logout-url="/logout"
logout-success-url="/login.jsp" />
<!-- 关闭CSRF,默认是开启的 -->
<security:csrf disabled="true" />
</security:http>
<!--静态配置认证的用户及密码-->
<security:authentication-manager>
<security:authentication-provider>
<security:user-service>
<security:user name="user" password="{noop}user"
authorities="ROLE_USER" />
<security:user name="admin" password="{noop}admin"
authorities="ROLE_ADMIN" />
</security:user-service>
</security:authentication-provider>
</security:authentication-manager>
</beans>运行Maven工程
运行工程时,首先会弹出一个要求输入用户名和密码的页面,这是spring-security为我们提供的默认的登录页面,当我们没有指定登录页面时会使用该页面。
输入用户名:admin,密码:admin时,会提示403,表示权限不足,这是因为上面配置的access角色需要是ROLE_USER
输入用户名:user,密码:user时,可以正常登录。
输入错误的用户名或者密码时,会提示账号或者密码错误信息。
3. 实战【ssm权限管理系统】
导入依赖
web配置文件中配置过滤器、spring-security的配置文件解析
配置spring-security
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:security="http://www.springframework.org/schema/security"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security.xsd">
<!--配置不拦截的资源-->
<security:http pattern="/login.jsp" security="none"/>
<security:http pattern="/failer.jsp" security="none"/>
<security:http pattern="/css/**" security="none"/>
<security:http pattern="/img/**" security="none"/>
<security:http pattern="/plugins/**" security="none"/>
<!--配置具体-->
<!--配值是否使用默认登录页面、不使用sepl表达式-->
<security:http auto-config="true" use-expressions="false">
<!--配置拦截地址、可访问的角色-->
<security:intercept-url pattern="/**" access="ROLE_USER,ROLE_ADMIN"/>
<!--定义跳转页面-->
<!--
login-page="/login.jsp" 指定默认的登录页面
login-processing-url="/login" 指定登录页面登录的处理方法
default-target-url="index.jsp"
authentication-failure-url="/failer.jsp" 指定失败跳转页面
authentication-success-forward-url="/pages/main.jsp" 指定成功跳转页面
-->
<security:form-login
login-page="/login.jsp"
login-processing-url="/login"
default-target-url="/index.jsp"
authentication-failure-url="/failer.jsp"
authentication-success-forward-url="/pages/main.jsp"
/>
<!--关闭跨越请求-->
<security:csrf disabled="true"/>
<!-- 指定退出 -->
<security:logout invalidate-session="true" logout-url="/logout" logout-success-url="/login.jsp"/>
</security:http>
<!--数据库方式验证-->
<security:authentication-manager>
<security:authentication-provider user-service-ref="userLoginServiceImpl">
<!--配置加密方式-->
</security:authentication-provider>
</security:authentication-manager>
</beans>配置不过滤的元素
配置可以访问的角色
配置登录页面、处理登录请求的方法,处理登录成功、登录失败跳转的页面等
配置处理请求的服务
将登陆请求的url指向前面定义的
login-processing-url
参数1
2
3<form action="/login" method="post">
<!--省略....-->
</form>创建处理登录请求的接口
创建UserLoginService继承继承自UserDtailsService接口
1
2public interface UserLoginService extends UserDetailsService {
}创建UserLoginService的实体类并重写方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class UserLoginServiceImpl implements UserLoginService {
private UserDao userDao;
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
System.out.println(username);
UserInfo userInfo = userDao.findUserByUsername(username);
System.out.println(userInfo);
List<Role> roles = userInfo.getRoles();
System.out.println(userInfo);
List<SimpleGrantedAuthority> authorities = getAuthority(roles);
User user = new User(userInfo.getUsername(),"{noop}"+userInfo.getPassword(),true,true,true,true,authorities);
return user;
}
private List<SimpleGrantedAuthority> getAuthority(List<Role> roles){
List<SimpleGrantedAuthority> authorities = new ArrayList<>();
for (Role role : roles) {
authorities.add(new SimpleGrantedAuthority("ROLE_"+role.getRoleName()));
}
return authorities;
}
}实战总结
【依赖以及web配置文件的配置】较为固定没有什么难度,不过给过滤器定义名称时要注意。
【Spring-security配置文件配置】根据需求定义访问的角色、结束登录请求的地址,登录的挑战等。
【接口的继承以及实现】记住要实现的接口,以及实现类实现方法的含义。