1、认证与授权
认证:系统中,用户需要登录才可以正常进行功能访问,登录时就需要进行认证,确保为合法用户再进行操作;
授权:app中的功能较多,有些账号不需要访问所有的功能。此时就需要根据账号对应的角色来进行访问不同的功能,此时就需要的时对账号进行授权访问;
2、业务表结构
一般带认证授权的业务需要7张表来完成功能的实现。其中4张数据表,用户表t_user、权限表t_permission、角色表t_role、菜单表t_menu;3张数据表的关系表,

<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>
3.2 web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 加载spring容器 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:applicationContext.xml;classpath:spring-security.xml</param-value>
</context-param>
<filter>
<!--DelegatingFilterProxy用于整合第三方框架 整合Spring Security时过滤器的名称必须为springSecurityFilterChain,
否则会抛出NoSuchBeanDefinitionException异常 -->
<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>
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring*.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
3.3 spring-security.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:security="http://www.springframework.org/schema/security"
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:用于定义相关权限控制
auto‐config:是否自动配置 设置为true时框架会提供默认的一些配置,例如提供默认的登 录页面、登出处理等
设置为false时需要显示提供登录表单配置,否则会报错
use‐expressions:用于指定intercept‐url中的access属性是否使用表达式,true使用
-->
<security:http auto-config="true" use-expressions="true">
<!--intercept‐url:定义一个拦截规则
pattern:对哪些url进行权限控制。/**代表所有权限
access:在请求对应的URL时需要什么权限,默认配置时它应该是一个以逗号分隔的角色列表,请求的用户只需拥有其中的一个角色就能成功访问对应的URL
-->
<security:intercept-url pattern="/**" access="hasRole('ROLE_ADMIN')"/>
</security:http>
<!-- authentication‐manager:认证管理器,用于处理认证操作 -->
<security:authentication-manager>
<!-- authentication‐provider:认证提供者,执行具体的认证逻辑 -->
<security:authentication-provider>
<!-- user‐service:用于获取用户信息,提供给authentication‐provider进行认证 -->
<security:user-service>
<!--
user:定义用户信息,可以指定用户名、密码、角色,后期可以改为从数据库查询用户信息
{noop}:表示当前使用的密码为明文
-->
<security:user name="admin" password="{noop}Admin" authorities="ROLE_ADMIN"/>
</security:user-service>
</security:authentication-provider>
</security:authentication-manager>
</beans>
4、验证
4.1 启动tomcat,访问工程页面,自动跳转至 http://localhost:85/login 页面;该页面为security提供的默认登录界面
4.2 输入账号密码,登录成功,访问业务index.html页面
4.3 遗留问题:
4.3.1 业务所有的资源都被保护,但实际上一些css,js等文件不需要保护,匿名也可以进行访问,
4.3.2 登录界面为默认的,业务需要个性化登录页面,
4.3.3 登录账号密码实际应该从数据库读取,
4.3.4 密码需要加密处理而非明文记录;
5、问题解决
5.1 配置可匿名访问的资源
<!-- 配置可匿名访问的资源 -->
<security:http security="none" pattern="/page/a.html"/>
<security:http security="none" pattern="/page/b.html"/>
<security:http security="none" pattern="/js/**"/>
5.2 使用个性化登录页面
<!-- 首先必须配置自定义登录页面可以匿名访问 -->
<security:http security="none" pattern="/login.html" />
<!-- 定义表单登录信息
login-page:默认的登录界面;
username-parameter:登录页面自定义form表单账号的提交参数名
password-parameter:登录页面自定义form表单密码的提交参数名
login-processing-url: 登录请求拦截的url,也就是自定义form表单提交时指定的action
default-target-url:默认的登录成功显示页面
authentication-failure-url:登录失败后跳转的页面
-->
<security:form-login
login-page="/login.html"
username-parameter="username"
password-parameter="password"
login-processing-url="/login.do"
default-target-url="/index.html"
authentication-failure-url="/login.html"/>
<!--csrf:对应CsrfFilter过滤器 disabled:是否启用CsrfFilter过滤器,如果使用自定义登录页面需要关闭此项,否则 登录操作会被禁用(403) -->
<security:csrf disabled="true"></security:csrf>
5.3 实现数据库读取验证账号密码
5.3.1 实现spring security框架提供的一个UserDetailsService接口,重新接口的loadUserByUsername()方法,最终返回一个UserDetails(携带账号,密码,权限)的对象;
5.3.2 在spring-security.xml中对实现的类进行对象声明;
5.3.3 在spring-security.xml中对认证提供者进行修改
<security:authentication-provider user-service-ref="userService">
</security:authentication-provider>