1。SpringSecurity概念 SpringSecurity是Spring采用AOP思想,基于servlet过滤器实现的安全框架。它提供了完善的认证机制和方法级的授权功能。是一款非常优秀的权限管理框架。 SpringSecurity是一个功能强大且高度可定制的身份验证和访问控制框架。它是用于保护基于Spring的应用程序的事实上的标准。 SpringSecurity是一个框架,致力于为Java应用程序提供身份验证和授权。像所有Spring项目一样,SpringSecurity的真正强大之处在于它可以轻松扩展以满足定制需求的能力。 特征 对身份验证和授权的全面且可扩展的支持 保护免受会话固定,点击劫持,跨站点请求伪造等攻击 ServletAPI集成 与SpringWebMVC的可选集成1。2快速入门案例1。2。1环境准备 准备一个SpringMVCSpringjsp的Web环境,然后在这个基础上整合SpringSecurity。 首先创建Web项目 添加相关的依赖 junit junitartifactId 4。11 test org。springframework springwebmvcartifactId 5。2。1。RELEASE javax。servlet servletapiartifactId 2。5 provided org。slf4j slf4jlog4j12artifactId 1。7。25 添加相关的配置文件 Spring配置文件 ?xmlversion1。0encodingUTF8? xmlns:xsihttp:www。w3。org2001XMLSchemainstance xmlns:contexthttp:www。springframework。orgschemacontext xsi:schemaLocationhttp:www。springframework。orgschemabeans http:www。springframework。orgschemabeansspringbeans。xsd http:www。springframework。orgschemacontext http:www。springframework。orgschemacontextspringcontext。xsd SpringMVC配置文件 ?xmlversion1。0encodingUTF8? xmlns:xsihttp:www。w3。org2001XMLSchemainstance xmlns:contexthttp:www。springframework。orgschemacontext xmlns:mvchttp:www。springframework。orgschemamvc xsi:schemaLocationhttp:www。springframework。orgschemabeans http:www。springframework。orgschemabeansspringbeans。xsd http:www。springframework。orgschemacontext http:www。springframework。orgschemacontextspringcontext。xsd http:www。springframework。orgschemamvc http:www。springframework。orgschemamvcspringmvc。xsd log4j。properties文件 log4j。rootCategoryINFO,stdout log4j。appender。stdoutorg。apache。log4j。ConsoleAppender log4j。appender。stdout。layoutorg。apache。log4j。PatternLayout log4j。appender。stdout。layout。ConversionPattern〔QC〕p〔t〕C。M(L)mn web。xml SunMicrosystems,Inc。DTDWebApplication2。3EN http:java。sun。comdtdwebapp23。dtd xmlns:xsihttp:www。w3。org2001XMLSchemainstance xsi:schemaLocationhttp:java。sun。comxmlnsjavaee http:java。sun。comxmlnsjavaeewebapp25。xsd ArchetypeCreatedWebApplication contextConfigLocation classpath:applicationContext。xml org。springframework。web。context。ContextLoaderListener CharacterEncodingFilter org。springframework。web。filter。CharacterEncodingFilter encoding utf8 CharacterEncodingFilter dispatcherServletb org。springframework。web。servlet。DispatcherServlet contextConfigLocation classpath:springmvc。xml 1hrdispatcherServletb 添加Tomcat的插件启动测试 org。apache。tomcat。maven tomcat7mavenpluginartifactId 2。2 8082hr 1。2。2整合SpringSecurity 添加相关的依赖 springsecuritycore。jar核心包,任何SpringSecurity的功能都需要此包 springsecurityweb。jar:web工程必备,包含过滤器和相关的web安全的基础结构代码 springsecurityconfig。jar:用于xml文件解析处理 springsecuritytablibs。jar:动态标签库 org。springframework。security springsecurityconfigartifactId 5。1。5。RELEASE org。springframework。security springsecuritytaglibsartifactId 5。1。5。RELEASE web。xml文件中配置SpringSecurity springSecurityFilterChain org。springframework。web。filter。DelegatingFilterProxy springSecurityFilterChain 添加SpringSecurity的配置文件 ?xmlversion1。0encodingUTF8? xmlns:xsihttp:www。w3。org2001XMLSchemainstance xmlns:securityhttp:www。springframework。orgschemasecurity xsi:schemaLocationhttp:www。springframework。orgschemabeans http:www。springframework。orgschemabeansspringbeans。xsd http:www。springframework。orgschemasecurity http:www。springframework。orgschemasecurityspringsecurity。xsd 将SpringSecurity的配置文件引入到Spring中 启动测试访问 2。认证操作2。1自定义登录页面 CreatedbyIntelliJIDEA。 User:dpb Date:2021316 Time:16:57 TochangethistemplateuseFileSettingsFileTemplates。 pagecontentTcharsetUTF8languagejava Title 登录页面 修改相关的配置文件 ?xmlversion1。0encodingUTF8? xmlns:xsihttp:www。w3。org2001XMLSchemainstance xmlns:securityhttp:www。springframework。orgschemasecurity xsi:schemaLocationhttp:www。springframework。orgschemabeans http:www。springframework。orgschemabeansspringbeans。xsd http:www。springframework。orgschemasecurity http:www。springframework。orgschemasecurityspringsecurity。xsd loginprocessingurllogin defaulttargeturlhome。jsp authenticationfailureurlerror。jsp logoutsuccessurllogin。jsp security:http beans blockquote 访问home。jsp页面后会自动跳转到自定义的登录页面,说明这个需求是实现了 但是当我们提交了请求后页面出现了如下的错误 2。2关闭CSRF拦截 为什么系统默认的登录页面提交没有CRSF拦截的问题呢 我自定义的认证页面没有这个信息怎么办呢?两种方式: 关闭CSRF拦截 登录成功 使用CSRF防护 在页面中添加对应taglib 我们访问登录页面 登录成功 2。3数据库认证 前面的案例我们的账号信息是直接写在配置文件中的,这显然是不太好的,我们来介绍小如何实现和数据库中的信息进行认证 添加相关的依赖 org。mybatis mybatisartifactId 3。5。4 org。mybatis mybatisspringartifactId 2。0。4 mysql mysqlconnectorjavaartifactId 8。0。11 com。alibaba druidartifactId 1。1。8 添加配置文件 jdbc。drivercom。mysql。cj。jdbc。Driver jdbc。urljdbc:mysql:localhost:3306logistics?characterEncodingutf8serverTimezoneUTC jdbc。usernameroot jdbc。password123456 ?xmlversion1。0encodingUTF8? xmlns:xsihttp:www。w3。org2001XMLSchemainstance xmlns:contexthttp:www。springframework。orgschemacontext xsi:schemaLocationhttp:www。springframework。orgschemabeans http:www。springframework。orgschemabeansspringbeans。xsd http:www。springframework。orgschemacontext http:www。springframework。orgschemacontextspringcontext。xsd 需要完成认证的service中继承UserDetailsService父接口 实现类中实现验证方法 packagecom。bobo。service。 importcom。bobo。mapper。UserM importcom。bobo。pojo。U importcom。bobo。pojo。UserE importcom。bobo。service。IUserS importorg。springframework。beans。factory。annotation。A importorg。springframework。security。core。authority。SimpleGrantedA importorg。springframework。security。core。userdetails。UserD importorg。springframework。security。core。userdetails。UsernameNotFoundE importorg。springframework。stereotype。S importjava。util。ArrayL importjava。util。L Service publicclassUserServiceImplimplementsIUserService{ Autowired privateUserM Override publicUserDetailsloadUserByUsername(Strings)throwsUsernameNotFoundException{ 根据账号查询用户信息 UserExampleexamplenewUserExample(); example。createCriteria()。andUserNameEqualTo(s); Listusersmapper。selectByExample(example); if(users!nullusers。size()0){ Useruserusers。get(0); if(user!null){ ListauthoritiesnewArrayList(); 设置登录账号的角色 authorities。add(newSimpleGrantedAuthority(ROLEUSER)); UserDetailsuserDetailsneworg。springframework。security。core。userdetails。User( user。getUserName(),{noop}user。getPassword(),authorities ); returnuserD } } } } blockquote 最后修改配置文件关联我们自定义的service即可 2。4加密 在SpringSecurity中推荐我们是使用的加密算法是BCryptPasswordEncoder 首先生成秘闻 修改配置文件 去掉{noop} 2。5认证状态 用户的状态包括是否可用,账号过期,凭证过期,账号锁定等等。 我们可以在用户的表结构中添加相关的字段来维护这种关系2。6记住我 在表单页面添加一个记住我的按钮。 在SpringSecurity中默认是关闭RememberMe功能的,我们需要放开 这样就配置好了。 记住我的功能会方便大家的使用,但是安全性却是令人担忧的,因为Cookie信息存储在客户端很容易被盗取,这时我们可以将这些数据持久化到数据库中。 CREATETABLEpersistentlogins( usernameVARCHAR(64)NOTNULL, seriesVARCHAR(64)NOTNULL, tokenVARCHAR(64)NOTNULL, lastusedTIMESTAMPNOTNULL, PRIMARYKEY(series) )ENGINEINNODBDEFAULTCHARSETutf8 注意设置了过期时间,到期后并不是删除表结构中的数据,而是客户端不会在携带相关信息了,同时删除掉数据库中的数据记住我也会失效3。授权3。1注解使用 开启注解的支持 ?xmlversion1。0encodingUTF8? xmlns:xsihttp:www。w3。org2001XMLSchemainstance xmlns:contexthttp:www。springframework。orgschemacontext xmlns:mvchttp:www。springframework。orgschemamvc xmlns:securityhttp:www。springframework。orgschemasecurity xsi:schemaLocationhttp:www。springframework。orgschemabeans http:www。springframework。orgschemabeansspringbeans。xsd http:www。springframework。orgschemacontext http:www。springframework。orgschemacontextspringcontext。xsd http:www。springframework。orgschemamvc http:www。springframework。orgschemamvcspringmvc。xsd http:www。springframework。orgschemasecurity http:www。springframework。orgschemasecurityspringsecurity。xsd security:globalmethodsecurity jsr250annotationsenabled prepostannotationsenabled securedannotationsenabled jsr250的使用 添加依赖 javax。annotation jsr250apiartifactId 1。0 控制器中通过注解设置 packagecom。bobo。 importorg。springframework。stereotype。C importorg。springframework。web。bind。annotation。RequestM importjavax。annotation。security。RolesA Controller RequestMapping(user) publicclassUserController{ RolesAllowed(value{ROLEADMIN}) RequestMapping(query) publicStringquery(){ System。out。println(用户查询。。。。); returnhome。 } RolesAllowed(value{ROLEUSER}) RequestMapping(save) publicStringsave(){ System。out。println(用户添加。。。。); returnhome。 } RequestMapping(update) publicStringupdate(){ System。out。println(用户更新。。。。); returnhome。 } } Spring表达式的使用 packagecom。bobo。 importorg。springframework。security。access。prepost。PreA importorg。springframework。stereotype。C importorg。springframework。web。bind。annotation。RequestM importjavax。annotation。security。RolesA Controller RequestMapping(order) publicclassOrderController{ PreAuthorize(valuehasAnyRole(ROLEUSER)) RequestMapping(query) publicStringquery(){ System。out。println(用户查询。。。。); returnhome。 } PreAuthorize(valuehasAnyRole(ROLEADMIN)) RequestMapping(save) publicStringsave(){ System。out。println(用户添加。。。。); returnhome。 } RequestMapping(update) publicStringupdate(){ System。out。println(用户更新。。。。); returnhome。 } } SpringSecurity提供的注解 packagecom。bobo。 importorg。springframework。security。access。annotation。S importorg。springframework。security。access。prepost。PreA importorg。springframework。stereotype。C importorg。springframework。web。bind。annotation。RequestM Controller RequestMapping(role) publicclassRoleController{ Secured(ROLEUSER) RequestMapping(query) publicStringquery(){ System。out。println(用户查询。。。。); returnhome。 } Secured(ROLEADMIN) RequestMapping(save) publicStringsave(){ System。out。println(用户添加。。。。); returnhome。 } RequestMapping(update) publicStringupdate(){ System。out。println(用户更新。。。。); returnhome。 } } 异常处理 新增一个错误页面,然后在SpringSecurity的配置文件中配置即可 当然你也可以使用前面介绍的SpringMVC中的各种异常处理器处理 3。2标签使用 前面介绍的注解的权限管理可以控制用户是否具有这个操作的权限,但是当用户具有了这个权限后进入到具体的操作页面,这时我们还有进行更细粒度的控制,这时注解的方式就不太适用了,这时我们可以通过标签来处里 添加SpringSecurity的标签库 CreatedbyIntelliJIDEA。 User:dpb Date:2021316 Time:17:02 TochangethistemplateuseFileSettingsFileTemplates。 pagecontentTcharsetUTF8languagejava taglibprefixsecurityurihttp:www。springframework。orgsecuritytags Title 欢迎光临。。。 用户查询 用户添加 用户更新 用户删除 页面效果