1 第一步
搭建一个基于maven的web工程
2 第二步
在web.xml配置文件中写上如下代码
| <!DOCTYPE web-app PUBLIC |
| "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" |
| "http://java.sun.com/dtd/web-app_2_3.dtd" > |
| |
| <web-app> |
| <display-name>Archetype Created Web Application</display-name> |
| <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> |
| <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-security.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> |
第三步:建立Spring-security的配置文件
| <?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:context="http://www.springframework.org/schema/context" |
| xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" |
| xmlns:mvc="http://www.springframework.org/schema/mvc" |
| 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/mvc |
| http://www.springframework.org/schema/mvc/spring-mvc.xsd |
| http://code.alibabatech.com/schema/dubbo |
| http://code.alibabatech.com/schema/dubbo/dubbo.xsd |
| http://www.springframework.org/schema/context |
| http://www.springframework.org/schema/context/spring-context.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:http auto-config="true" use-expressions="true"> |
| |
| |
| |
| |
| |
| |
| <security:intercept-url pattern="/pages/a.html" access="isAuthenticated()" /> |
| |
| |
| <security:intercept-url pattern="/pages/b.html" access="hasAuthority('add')" /> |
| |
| |
| <security:intercept-url pattern="/pages/c.html" access="hasRole('ROLE_ADMIN')" /> |
| |
| |
| |
| <security:intercept-url pattern="/pages/d.html" access="hasRole('ADMIN')" /> |
| <security:intercept-url pattern="/**" access="hasRole('ROLE_ADMIN')"></security:intercept-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"></security:form-login> |
| |
| |
| |
| |
| |
| <security:csrf disabled="true"></security:csrf> |
| |
| |
| |
| |
| |
| |
| <security:logout logout-url="/logout.do" |
| logout-success-url="/login.html" invalidate-session="true"/> |
| |
| </security:http> |
| |
| |
| <security:authentication-manager> |
| |
| <security:authentication-provider user-service-ref="userService2"> |
| |
| |
| |
| |
| |
| |
| |
| <security:password-encoder ref="passwordEncoder"></security:password-encoder> |
| </security:authentication-provider> |
| </security:authentication-manager> |
| |
| <bean id="userService" class="com.itheima.service.SpringSecurityUserService"></bean> |
| <bean id="userService2" class="com.itheima.service.SpringSecurityUserService2"></bean> |
| |
| <bean id="passwordEncoder" |
| class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder" /> |
| |
| |
| <context:annotation-config></context:annotation-config> |
| |
| <mvc:annotation-driven></mvc:annotation-driven> |
| <context:component-scan base-package="com.itheima.controller"></context:component-scan> |
| |
| |
| <security:global-method-security pre-post-annotations="enabled" /> |
| </beans> |
4 关于第三步配置文件的讲解
4-1 配置拦截
| <security:http auto-config="true" use-expressions="true"> |
| <security:intercept-url pattern="/**" access="hasRole('ROLE_ADMIN')"></security:intercept-url> |
| </security:http> |
- auto-config 自动配置,如果设置为true,表示自动应用一些默认配置,比如框架会提供一个默认的登录页面,会帮我们提供一个Spring生成的Controller
- use-expressions:是否使用spring security提供的表达式来描述权限
- pattern:描述拦截规则
- asscess:指定所需的访问角色或者访问权限
4-2 配置认证管理器
| <security:authentication-manager> |
| |
| <security:authentication-provider> |
| <security:user-service > |
| <security:user name="admin" password="{noop}1234" authorities="ROLE_ADMIN"></security:user> |
| </security:user-service> |
| </security:authentication-provider> |
| </security:authentication-manager> |
这段代码表示写死一个用户,其中,{noop}表示密码使用明文来登录,不加密。
4-3 配置可匿名访问,不用登录就可以访问
| <security:http security="none" pattern="/pages/a.html"></security:http> |
| <security:http security="none" pattern="/pages/**"></security:http> |
4-4 使用指定的登录页面
第一步对登录页面放行,不拦截
| <security:http security="none" pattern="login.html"></security:http> |
第二步:定义表单登录信息
| <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" |
| ></security:form-login> |
第3步,关闭csrf过滤器
| <security:csrf disabled="true"></security:csrf> |
5 从数据库查询用户信息
5-1
编写一个类SpringSecurityUserService,实现UserDetailsService接口并重写方法,框架会自动帮我们调用这个方法,username就是前端登录的用户名,但是框架怎样就能自动帮我们调用一个我们自己写的方法呢,所以,我们需要配置一下
| public class SpringSecurityUserService implements UserDetailsService { |
| |
| @java.lang.Override |
| public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { |
| |
| System.out.println("输入的用户名是"+username); |
| return null; |
| } |
| } |
5-2 在配置文件中配置刚才5-1写的类
| <security:authentication-manager> |
| |
| <security:authentication-provider user-service-ref="userService"> |
| |
| |
| |
| </security:authentication-provider> |
| </security:authentication-manager> |
| |
| <bean id="userService" class="com.itheima.service.SpringSecurityUserService"></bean> |
2个地方,第一个,需要配置<bean id="userService" class="com.itheima.service.SpringSecurityUserService"></bean>
,
第二个,需要引用这个对象。
5-3 模拟从数据库查询
| package com.itheima.service; |
| |
| import com.itheima.pojo.User; |
| import org.springframework.security.core.GrantedAuthority; |
| import org.springframework.security.core.authority.SimpleGrantedAuthority; |
| import org.springframework.security.core.userdetails.UserDetails; |
| import org.springframework.security.core.userdetails.UserDetailsService; |
| import org.springframework.security.core.userdetails.UsernameNotFoundException; |
| |
| import java.util.ArrayList; |
| import java.util.HashMap; |
| import java.util.List; |
| import java.util.Map; |
| |
| public class SpringSecurityUserService implements UserDetailsService { |
| |
| public static Map<String, User> map = new HashMap<>(); |
| static { |
| com.itheima.pojo.User user1 = new com.itheima.pojo.User(); |
| user1.setUsername("admin"); |
| user1.setPassword("admin"); |
| |
| com.itheima.pojo.User user2 = new com.itheima.pojo.User(); |
| user2.setUsername("xiaoming"); |
| user2.setPassword("1234"); |
| |
| map.put(user1.getUsername(),user1); |
| map.put(user2.getUsername(),user2); |
| } |
| |
| |
| public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { |
| System.out.println("用户输入的用户名为:" + username); |
| |
| User user = map.get(username); |
| if(user == null){ |
| |
| return null; |
| }else{ |
| |
| |
| List<GrantedAuthority> list = new ArrayList<>(); |
| |
| list.add(new SimpleGrantedAuthority("permission_A")); |
| list.add(new SimpleGrantedAuthority("permission_B")); |
| |
| if(username.equals("admin")){ |
| list.add(new SimpleGrantedAuthority("ROLE_ADMIN")); |
| } |
| org.springframework.security.core.userdetails.User securityUser = new org.springframework.security.core.userdetails.User(username,"{noop}"+user.getPassword(),list); |
| return securityUser; |
| } |
| } |
| } |
| |
5-4 不同权限控制
- isAuthenticated()只要认证通过就可以放访问
- hasAuthority()只要拥有某个角色就可以通过
- hasRole()有某个角色才可以通过
5-5 通过注解控制权限
第一步:
在Spring-security.xml中配置组建扫描,扫描controller
| <mvc:annotation-driven></mvc:annotation-driven> |
| <context:component-scan base-package="com.itheima.controller"></context:component-scan> |
第二步
开启注解方式权限控制
| |
| <security:global-method-security pre-post-annotations="enabled" /> |
第三步
创建controller类并使用权限注解
| package com.itheima.controller; |
| |
| import org.springframework.security.access.prepost.PreAuthorize; |
| import org.springframework.web.bind.annotation.RestController; |
| import org.springframework.web.bind.annotation.RequestMapping; |
| |
| @RestController |
| @RequestMapping("/hello") |
| public class HelloController { |
| @RequestMapping("/add") |
| @PreAuthorize("hasAuthority('add')") |
| public String add(){ |
| System.out.println("add..."); |
| return "success"; |
| } |
| |
| @RequestMapping("/delete") |
| @PreAuthorize("hasRole('ROLE_ADMIN')") |
| public String delete(){ |
| System.out.println("delete..."); |
| return "success"; |
| } |
| } |
6 退出登录
| <security:logout logout-url="/logout.do" |
| logout-success-url="/login.html" invalidate-session="true"/> |
7 完成版的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:context="http://www.springframework.org/schema/context" |
| xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" |
| xmlns:mvc="http://www.springframework.org/schema/mvc" |
| 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/mvc |
| http://www.springframework.org/schema/mvc/spring-mvc.xsd |
| http://code.alibabatech.com/schema/dubbo |
| http://code.alibabatech.com/schema/dubbo/dubbo.xsd |
| http://www.springframework.org/schema/context |
| http://www.springframework.org/schema/context/spring-context.xsd |
| http://www.springframework.org/schema/security |
| http://www.springframework.org/schema/security/spring-security.xsd"> |
| |
| |
| <security:http security="none" pattern="/pages/**"></security:http> |
| <security:http security="none" pattern="login.html"></security:http> |
| |
| <security:http auto-config="true" use-expressions="true"> |
| <security:intercept-url pattern="/**" access="hasRole('ROLE_ADMIN')"></security:intercept-url> |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| <security:logout logout-url="/logout.do" |
| logout-success-url="/login.html" invalidate-session="true"/> |
| </security:http> |
| |
| <security:authentication-manager> |
| |
| <security:authentication-provider user-service-ref="userService"> |
| |
| |
| |
| |
| <security:password-encoder ref="passwordEncoder"></security:password-encoder> |
| </security:authentication-provider> |
| </security:authentication-manager> |
| |
| <bean id="userService" class="com.itheima.service.SpringSecurityUserService"></bean> |
| |
| |
| <bean id="passwordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"></bean> |
| |
| |
| <context:annotation-config></context:annotation-config> |
| |
| <mvc:annotation-driven></mvc:annotation-driven> |
| <context:component-scan base-package="com.itheima.controller"></context:component-scan> |
| <security:global-method-security pre-post-annotations="enabled" /> |
| </beans> |
我对任何唾手而得,快速,出自本能,即兴,含混的事物没有信心。我相信缓慢,平和,细水长流的力量,踏实,冷静。我不相信缺乏自律精神和不自我建设,不努力,可以得到个人或集体的解放。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!