<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0modelVersion>
<groupId>com.itheimagroupId>
<artifactId>spring-security-demoartifactId>
<version>1.0-SNAPSHOTversion>
<packaging>warpackaging>
<properties>
<spring.version>5.0.5.RELEASEspring.version>
properties>
<dependencies>
<dependency>
<groupId>org.springframework.securitygroupId>
<artifactId>spring-security-webartifactId>
<version>${spring.version}version>
dependency>
<dependency>
<groupId>org.springframework.securitygroupId>
<artifactId>spring-security-configartifactId>
<version>${spring.version}version>
dependency>
<dependency>
<groupId>javax.servletgroupId>
<artifactId>servlet-apiartifactId>
<version>2.5version>
<scope>providedscope>
dependency>
dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.mavengroupId>
<artifactId>tomcat7-maven-pluginartifactId>
<configuration>
<port>9090port>
<path>/path>
configuration>
plugin>
plugins>
build>
project>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<context-param>
<param-name>contextConfigLocationparam-name>
<param-value>classpath:spring-security.xmlparam-value>
context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
listener-class>
listener>
<filter>
<filter-name>springSecurityFilterChainfilter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxyfilter-class>
filter>
<filter-mapping>
<filter-name>springSecurityFilterChainfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>
web-app>
<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans"
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">
<http>
<intercept-url pattern="/**" access="hasRole('ROLE_ADMIN')"/>
<form-login/>
<logout/>
http>
<authentication-manager>
<authentication-provider>
<user-service>
<user name="admin" password="{noop}123456"
authorities="ROLE_ADMIN"/>
user-service>
authentication-provider>
authentication-manager>
beans:beans>
上面的案例为{noop}密码明文方式的代码,我们还有另一种bcrypt加密配置方式,来指定策略,同时,也可以将noop的位置 — bcrypt
<authentication-manager>
<authentication-provider>
<user-service>
<user name="admin"
password="$2a$10$EPtdfwSJ0ABj5JsCyLqhFe1g503DgA4lQvOxyZF/3usoyje5/q/Dy"
authorities="ROLE_ADMIN">user>
user-service>
<password-encoder ref="bcryptEncoder">password-encoder>
authentication-provider>
authentication-manager>
<beans:bean id="bcryptEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>spring-security demotitle>
head>
<body>
欢迎来到神奇的spring security世界!
body>
html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>logintitle>
head>
<body>
<form action="/login" method="post">
<table>
<tr>
<td>用户名:td>
<td><input name="username">td>
tr>
<tr>
<td>密码:td>
<td><input type="password" name="password">td>
tr>
table>
<button>登录button>
form>
body>
html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>log-errortitle>
head>
<body>
用户名或密码错误!
body>
html>
主要修改配置:
<csrf disabled="true">csrf>
<http pattern="/login.html" security="none">http>
<http pattern="/log_error.html" security="none">http>
修改后spring-security.xml:
<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans"
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">
<http pattern="/login.html" security="none">http>
<http pattern="/log_error.html" security="none">http>
<http>
<intercept-url pattern="/**" access="hasRole('ROLE_ADMIN')"/>
<form-login login-page="/login.html" default-target-url="/index.html" authentication-failure-url="/log_error.html" />
<logout/>
<csrf disabled="true">csrf>
http>
<authentication-manager>
<authentication-provider>
<user-service>
<user name="admin"
password="$2a$10$EPtdfwSJ0ABj5JsCyLqhFe1g503DgA4lQvOxyZF/3usoyje5/q/Dy"
authorities="ROLE_ADMIN">user>
user-service>
<password-encoder ref="bcryptEncoder">password-encoder>
authentication-provider>
authentication-manager>
<beans:bean id="bcryptEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/>
beans:beans>
替换xml配置
<user-service>
<user name="admin"
password="$2a$10$EPtdfwSJ0ABj5JsCyLqhFe1g503DgA4lQvOxyZF/3usoyje5/q/Dy"
authorities="ROLE_ADMIN">user>
user-service>
替换为:可进行更加灵活的进行用户的权限认证&权限赋予操作(如:后续进行数据库的查询认证以及权限授予),由于查询数据需要进行MyBatis及spring的配置,故在此略
**
* UserDetailService封装了:
* 1.权限认证
* 2.权限赋予
*/
public class UserDetailServiceImpl implements UserDetailsService {
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
//实际项目中应该从数据库中提取用户列表
List<GrantedAuthority> grantedAuthorities = new ArrayList<GrantedAuthority>();
//写死的权限授予,直接授予该用户ROLE_ADMIN权限
grantedAuthorities.add(new SimpleGrantedAuthority("ROLE_ADMIN"));
return new User(username,"$10$61ogZY7EXsMDWeVGQpDq3OBF1.phaUu7.xrwLyWFTOu8woE08zMIW",grantedAuthorities );
}
}
同时修改spring-security.xml配置
<authentication-manager>
<authentication-provider user-service-ref="userDetailService">
<password-encoder ref="bcryptEncoder">password-encoder>
authentication-provider>
authentication-manager>
<beans:bean id="userDetailService" class="com.springsecurity.demo.UserDetailServiceImpl">beans:bean>
<beans:bean id="bcryptEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/>
出现了控制台输入乱码:解决方案,settings – build – build tools – maven – runner 补充添加:-Dfile.encoding=GB2312
从图片中可以看出,再次测试后乱码问题得到解决
public class UserDetailServiceImpl implements UserDetailsService {
@Reference
private AdminService adminService;
public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {
System.out.println("经过了UserDetailServiceImpl");
//1. 权限认证
Map map=new HashMap<>();
map.put("loginName",s);
map.put("status","1");
List<Admin> list = adminService.findList(map);
if(list.size()==0){
return null;
}
//2.权限赋予
//实际项目中应该从数据库中提取用户的角色列表 通过角色 通过权限
List<GrantedAuthority> grantedAuthorities=new ArrayList<GrantedAuthority>();
//
grantedAuthorities.add( new SimpleGrantedAuthority("ROLE_ADMIN"));
return new User(s,list.get(0).getPassword(),grantedAuthorities);
}
}
最后补充:
SpringSecurity有个同源策略问题:
可以在spring-security.xml中标签体中配置
<headers>
<frame-options policy="SAMEORIGIN">frame-options>
headers>