Spring security初探

Springboot +spring security,实现session并发控制及实现原理分析 阅读详情

转载地址: http://yzxqml.iteye.com/blog/1756106


现在很多企业和开发团队都使用了SSH2(Struts 2 +Spring 2.5 +Hibernate)框架来进行开发,  我们或许已经习惯了强大的Spring Framework 全局配置管理,不可否认,Sping是一个很优秀的开源框架,但是由于Spring3.0版本后强大的的注解式bean的诞生,Spring MVC框架这匹黑马正悄然杀起,但今天Spring MVC不是主角,今天我和大家分享一个同样隶属于SpringSource 的安全框架——Spring Security, 下面的基于Spring MVC给大家分享一下Spring Security  的使用。虽然对它的接触时间不长,参考了一些网上朋友的做法,但也按照我的理解把这个框架介绍介绍,不是很专业,还请大家不要介意 。

    

     我们知道,Web 应用的安全性包括用户认证(Authentication)和用户授权(Authorization)两个部分。用户认证指的是验证某个用户是否为系统中的合法主体,也就是说用户能否访问该系统。用户授权指的是验证某个用户是否有权限执行某个操作。在一个系统中,不同用户所具有的权限是不同的。比如对一个资源来说,有的用户只能进行读取,而有的用户可以进行修改。一般来说,系统会为不同的用户分配不同的角色,而每个角色则对应一系列的权限。

 

     首先,我们看web.xml

 

Java代码   收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  3.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
  4.     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  
  5.     <!-- 编码统一最好放最上面,最先加载,防止乱码-->  
  6.     <filter>  
  7.         <filter-name>Set Character Encoding</filter-name>  
  8.         <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>  
  9.         <init-param>  
  10.             <param-name>encoding</param-name>  
  11.             <param-value>UTF-8</param-value>  
  12.         </init-param>  
  13.         <init-param>  
  14.             <param-name>forceEncoding</param-name>  
  15.             <param-value>true</param-value><!-- 强制进行转码 -->  
  16.         </init-param>  
  17.     </filter>  
  18.   
  19.     <filter-mapping>  
  20.         <filter-name>Set Character Encoding</filter-name>  
  21.         <url-pattern>/*</url-pattern>  
  22.     </filter-mapping>  
  23.     <!-- 然后接着是SpringSecurity必须的filter 优先配置,让SpringSecurity先加载,防止SpringSecurity拦截失效-->  
  24.     <filter>  
  25.         <filter-name>springSecurityFilterChain</filter-name>  
  26.         <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>  
  27.     </filter>  
  28.   
  29.     <filter-mapping>  
  30.         <filter-name>springSecurityFilterChain</filter-name>  
  31.         <url-pattern>/*</url-pattern>  
  32.     </filter-mapping>  
  33.   
  34.     <welcome-file-list>  
  35.         <welcome-file>index.jsp</welcome-file>  
  36.     </welcome-file-list>  
  37.   
  38.     <!--   
  39.     spring需要加载的配置文件  
  40. -->  
  41.     <context-param>  
  42.         <param-name>contextConfigLocation</param-name>  
  43.         <param-value>   
  44.     WEB-INF/classes/applicationContext.xml,  
  45.     WEB-INF/spring3-servlet.xml,  
  46.     WEB-INF/spring-security.xml   
  47.         </param-value>  
  48.     </context-param>  
  49.   
  50.     <listener>  
  51.         <listener-class>  
  52.             <!--     所以,要在web.xml下面配置好监听,让服务器启动时就初始化改类,可以得到request   -->  
  53.             org.springframework.web.context.request.RequestContextListener  
  54.         </listener-class>  
  55.     </listener>  
  56.     <listener>  
  57.         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
  58.     </listener>  
  59.   
  60.   
  61.     <!--  
  62.         默认所对应的配置文件是WEB-INF下的{servlet-name}-servlet.xml,这里便是:spring3-servlet.xml  
  63.     -->  
  64.     <servlet>  
  65.         <servlet-name>spring3</servlet-name>  
  66.         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
  67.         <load-on-startup>1</load-on-startup>  
  68.   
  69.     </servlet>  
  70.   
  71.     <servlet-mapping>  
  72.         <servlet-name>spring3</servlet-name>  
  73.         <!--  
  74.             这里可以用 / 但不能用 /*  
  75.             ,拦截了所有请求会导致静态资源无法访问,所以要在spring3-servlet.xml中配置mvc:resources  
  76.         -->  
  77.         <url-pattern>/</url-pattern>  
  78.     </servlet-mapping>  
  79.   
  80.   
  81.   
  82. </web-app>  

 

     

 

    注释已经写了挺多,还是稍微解释一下要注意的地方,一个是UTF-8编码转换,这个最好加在最前面,让它先生效,我在调试的时候就出过这种情况,web.xml里的其他配置都正常生效了,但是编码死活不行,一中文就乱码,郁闷了老半天,然后突发奇想,是不是web.xml里先声明的配置先生效,后声明的后生效?接着实践,果然不出我所料,把编码转换加在前面,一切正常。。。。我那个晕。。。

 

 

 

关于Spirng MVC的就不说了,那些数据访问、业务和控制层那些的东东就自个研究去了吧。。这不是今天的重点。

 

 接着是spring-security.xml

Java代码   收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  3.     xmlns:security="http://www.springframework.org/schema/security"  
  4.     xsi:schemaLocation="http://www.springframework.org/schema/beans   
  5.             http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
  6.             http://www.springframework.org/schema/security   
  7.             http://www.springframework.org/schema/security/spring-security-3.0.xsd">  
  8.   
  9.     <!--  Spring-Security 的配置 -->  
  10.     <!--  
  11.         注意use-expressions=true.表示开启表达式,否则表达式将不可用. see:http://www.family168.com/tutorial/springsecurity3/html/el-access.html  
  12.     -->  
  13.     <security:http auto-config="true" use-expressions="false" access-denied-page="/user/login_failure.html">  
  14.         <!--允许所有人访问-->  
  15.         <!--     <security:intercept-url pattern="/**" access="permitAll" />-->  
  16.         <!--允许ROLE_ADMIN权限访问-->  
  17.         <security:intercept-url pattern="/user/findAll.html" access="ROLE_ADMIN" />  
  18.         <!--允许ROLE_ADMIN权限访问-->  
  19.         <security:intercept-url pattern="/user/**" access="ROLE_ADMIN" />  
  20.         <!--允许ROLE_USER权限访问-->  
  21.         <security:intercept-url pattern="/success.jsp" access="ROLE_USER,ROLE_ADMIN" />  
  22.         <!--允许IS_AUTHENTICATED_ANONYMOUSLY匿名访问-->  
  23.         <security:intercept-url pattern="/anonymously.jsp" access="IS_AUTHENTICATED_ANONYMOUSLY" />  
  24.           
  25.         <!-- filters="none"  不过滤这些资源-->  
  26.         <security:intercept-url pattern="/js/**" filters="none" />  
  27.         <security:intercept-url pattern="/index.jsp" filters="none" />  
  28.   
  29.         <!-- login-page:默认指定的登录页面. authentication-failure-url:出错后跳转页面. default-target-url:成功登陆后跳转页面 -->  
  30.         <security:form-login login-page="/index.jsp" authentication-failure-url="/user/login_failure.html"  
  31.             default-target-url="/success.jsp" />  
  32.         <!--  
  33.             invalidate-session:指定在退出系统时是否要销毁Session。logout-success-url:退出系统后转向的URL。logout-url:指定了用于响应退出系统请求的URL。其默认值为:/j_spring_security_logout。  
  34.         -->  
  35.         <security:logout invalidate-session="true" logout-success-url="/index.jsp" logout-url="/j_spring_security_logout" />  
  36.         <!--  
  37.             max-sessions:允许用户帐号登录的次数。范例限制用户只能登录一次。exception-if-maximum-exceeded:  
  38.             默认为false,此值表示:用户第二次登录时,前一次的登录信息都被清空。当exception-if-maximum-exceeded="true"时系统会拒绝第二次登录。  
  39.         -->  
  40.   
  41.         <security:session-management>  
  42.             <security:concurrency-control error-if-maximum-exceeded="true" max-sessions="1" />  
  43.         </security:session-management>  
  44.   
  45.     </security:http>  
  46.     <!-- 指定一个自定义的authentication-manager :customUserDetailsService -->  
  47.     <security:authentication-manager>  
  48.         <security:authentication-provider user-service-ref="customUserDetailsService">  
  49.             <security:password-encoder ref="passwordEncoder" />  
  50.         </security:authentication-provider>  
  51.     </security:authentication-manager>  
  52.   
  53.     <!-- 对密码进行MD5编码 -->  
  54.     <bean id="passwordEncoder" class="org.springframework.security.authentication.encoding.Md5PasswordEncoder" />  
  55.   
  56.     <!--   
  57.         通过 customUserDetailsService,Spring会控制用户的访问级别.  
  58.         也可以理解成:以后我们和数据库操作就是通过customUserDetailsService来进行关联.  
  59.      -->  
  60.     <bean id="customUserDetailsService" class="org.yzsoft.springmvcdemo.util.CustomUserDetailsService" />  
  61.     <!-- 自定义登陆错误提示,可以取出mymessages.properties的国际化消息-->  
  62.     <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">  
  63.         <property name="basename" value="classpath:org/yzsoft/springmvcdemo/mymessages" />  
  64.     </bean>  
  65.     <bean id="localeResolver" class="org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver" />  
  66. </beans>  

  

 

 这个多解释一下,首先

 

Java代码   收藏代码
  1. <security:intercept-url pattern="/findAll.html" access="hasRole('ROLE_ADMIN')" />  
  2.        <security:intercept-url pattern="/user/**" access="hasRole('ROLE_ADMIN')" />  
  3.        <security:intercept-url pattern="/anonymously.jsp" access="IS_AUTHENTICATED_ANONYMOUSLY" />  

 这个是权限控制,声明了拥有什么权限可以访问哪些资源,这个配置的是有ROLE_ADMIN权限的才可以访问/findAll.html,至于这个ROLE_ADMIN从哪来,呆会再解释。或者像第二句一样配置也可以:拥有ROLE_ADMIN权限的才可以访问/user/下的所有资源,否则都会抛出AccessDeniedException 。

IS_AUTHENTICATED_ANONYMOUSLY就是匿名访问的意思,这个相信都懂的。。。

 

然后是登陆和安全退出

Java代码   收藏代码
  1. <security:form-login login-page="/index.jsp" authentication-failure-url="/user/login_failure.html"default-target-url="/user/findAll.html" />  
  2. <security:logout invalidate-session="true" logout-success-url="/index.jsp" logout-url="/user/login_failure.html" />  

 解释下上面一句,相信看也能看出来了的,login-page:默认指定的登录页面. authentication-failure-url:出错后跳转页面(包括那些个啥用户名密码错误吖。。啥啥啥的。). default-target-url:成功登陆后跳转页面 (这里我直接跳到的控制器去查数据列表)。   

 

 接着:invalidate-session:指定在退出系统时是否要销毁Session。logout-success-url:退出系统后转向的URL。logout-url:指定了用于响应退出系统请求的URL。其默认值为:/j_spring_security_logout。

 

接下来是一个比较不错的功能:是否允许同一用户多处登陆

Java代码   收藏代码
  1. <security:session-management>  
  2.      <security:concurrency-control error-if-maximum-exceeded="true" max-sessions="1" />  
  3. </security:session-management>  

exception-if-maximum-exceeded:
   默认为false,此值表示:用户第二次登录时,前一次的登录信息都被清空。当error-if-maximum-exceeded="true"时系统会拒绝第二次登录。 

max-sessions:允许用户帐号登录的次数,这里我们允许一次登陆。这里我们做个实验吧,看看是不是真的生效了,请看图


 

 

这里我们看到,当同一个账号多处登陆时,就会报出Maximum sessions of 1 for this principal exceeded 的错误,当然,正式使用我们换成mymessages.properties里的我们自定义的国际化消息,这样人性化一点。
 

 好,我们往下看,接着就是应用我们实际项目里的自定义用户权限了

Java代码   收藏代码
  1. <security:authentication-manager>  
  2.      <security:authentication-provider user-service-ref="customUserDetailsService">  
  3.          <security:password-encoder ref="passwordEncoder" />  
  4.      </security:authentication-provider>  
  5. </security:authentication-manager>  
  6.   
  7.     <!-- 对密码进行MD5编码 -->  
  8. <bean id="passwordEncoder" class="org.springframework.security.authentication.encoding.Md5PasswordEncoder" />  
  9. <bean id="customUserDetailsService" class="org.yzsoft.springmvcdemo.util.CustomUserDetailsService" />  

 首先是<security:authentication-manager>是指定我们自定义的身份验证策略,这里我们用customUserDetailsService这个bean,就是指向我们CustomUserDetailsService.java这个类。然后<security:password-encoder>指定我们密码使用MD5进行编码,调用Spring Security自带的MD5加密类。当然,还有加盐MD5或我们自己写的加密算法等安全性更加高的密码策略。这个按项目实际使用配置吧。

 

然后看到我们的CustomUserDetailsService.java

Java代码   收藏代码
  1. package org.yzsoft.springmvcdemo.util;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.Collection;  
  5. import java.util.List;  
  6.   
  7. import org.apache.log4j.Logger;  
  8. import org.springframework.beans.factory.annotation.Autowired;  
  9. import org.springframework.dao.DataAccessException;  
  10. import org.springframework.security.core.GrantedAuthority;  
  11. import org.springframework.security.core.authority.GrantedAuthorityImpl;  
  12. import org.springframework.security.core.userdetails.User;  
  13. import org.springframework.security.core.userdetails.UserDetails;  
  14. import org.springframework.security.core.userdetails.UserDetailsService;  
  15. import org.springframework.security.core.userdetails.UsernameNotFoundException;  
  16. import org.yzsoft.springmvcdemo.serviceimpl.UsersServiceImpl;  
  17. import org.yzsoft.springmvcdemo.vo.TUsers;  
  18.   
  19. /** 
  20.  * 一个自定义的类用来和数据库进行操作. 即以后我们要通过数据库保存权限.则需要我们继承UserDetailsService 
  21.  *  
  22.  * @author  
  23.  *  
  24.  */  
  25. public class CustomUserDetailsService implements UserDetailsService {  
  26.   
  27.     protected static Logger logger = Logger.getLogger("service");//log4j,不用解释了吧。。  
  28.     @Autowired  
  29.     private UsersServiceImpl usersService;  
  30.   
  31.     public UsersServiceImpl getUsersService() {  
  32.         return usersService;  
  33.     }  
  34.   
  35.     public void setUsersService(UsersServiceImpl usersService) {  
  36.         this.usersService = usersService;  
  37.     }  
  38.   
  39.     public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException, DataAccessException {  
  40.   
  41.         UserDetails user = null;  
  42.   
  43.         try {  
  44.   
  45.             // 搜索数据库以匹配用户登录名.  
  46.             // 我们可以通过dao使用Hibernate来访问数据库  
  47.             System.out.println(username + "   用户页面输入的用户名");  
  48.             TUsers tusers = this.usersService.findByUsername(username);  
  49.             System.out.println(tusers.getUsername() + "   数据库取出的用户名");  
  50.             // Populate the Spring User object with details from the dbUser  
  51.             // Here we just pass the username, password, and access level  
  52.             // getAuthorities() will translate the access level to the correct  
  53.             // role type  
  54.             // 用户名、密码、是否启用、是否被锁定、是否过期、权限  
  55.             user = new User(tusers.getUsername(), tusers.getPassword().toLowerCase(), true, true, true, true, getAuthorities(Integer.parseInt(tusers.getRole())));  
  56.                
  57.                
  58.         } catch (Exception e) {  
  59.             logger.error("用户信息错误!");  
  60.             throw new UsernameNotFoundException("异常处理:检索用户信息未通过!");  
  61.         }  
  62.            
  63.         return user;  
  64.     }  
  65.   
  66.     /** 
  67.      * 获得访问角色权限列表 
  68.      *  
  69.      * @param access 
  70.      * @return 
  71.      */  
  72.     public Collection<GrantedAuthority> getAuthorities(Integer role) {  
  73.         System.out.println("取得的权限是  :" + role);  
  74.         List<GrantedAuthority> authList = new ArrayList<GrantedAuthority>();  
  75.   
  76.         // 所有的用户默认拥有ROLE_USER权限  
  77.         if (role == 0) {  
  78.             System.out.println("普通用户");  
  79.             logger.debug("取得普通用户权限-->");  
  80.             authList.add(new GrantedAuthorityImpl("ROLE_USERS"));  
  81.         }  
  82.         // 如果参数role为1.则拥有ROLE_ADMIN权限  
  83.         if (role == 1) {  
  84.             logger.debug("取得ADMIN用户权限-->");  
  85.             authList.add(new GrantedAuthorityImpl("ROLE_ADMIN"));  
  86.         }  
  87.         System.out.println(authList.size()+"  权限列表长度");  
  88.         return authList;  
  89.     }  
  90. }  

 这里就是把我们从数据库里面取得的用户权限和Spring Security的配置进行桥接,还记得上面配置文件里的ROLE_ADMIN吧,就是从这里来的,很奇怪的是,这个必须设置成ROLE_ 开头才有效。。郁闷。。。

这里我刚开始有一个疑惑,我们看这2句

Java代码   收藏代码
  1. TUsers tusers = this.usersService.findByUsername(username);  
  2. user = new User(tusers.getUsername(), tusers.getPassword().toLowerCase(), true, true, true, true, getAuthorities(Integer.parseInt(tusers.getRole())));  

 这里根本不需要用户输入的密码,只要了用户名,然后直接根据用户名去取权限,就直接设置进Spring Security的User对象里面去,我不禁一身冷汗,这不相当于说有了用户名就直接去查数据库么,而且是不用密码的。。。。

但经过查看官方文档和网上的解释,这才放心,原来是这样的,Spring Security的确是直接根据用户名去查,但是查得出来的Spring Security  User对象之后,它会根据这个对象的属性值去数据库查询与这个对象匹配的数据,我们这里设置的是(用户名,密码,是否启用、是否被锁定、是否过期、权限。。。),那么如果数据库存在这个对象,就返回真,否则返回假,这样也就不用担心了,完全可靠。就是我们在前台要做好限制,不能给用户不输密码就访问, 不然挤爆你数据库连接。。。。。

 

 

 最后登陆页面index.jsp

Java代码   收藏代码
  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
  2. <%  
  3. String path = request.getContextPath();  
  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
  5. %>  
  6.   
  7. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  8. <html>  
  9.   <head>  
  10.     <base href="<%=basePath%>">  
  11.       
  12.     <title>My JSP 'index.jsp' starting page</title>  
  13.     <meta http-equiv="pragma" content="no-cache">  
  14.     <meta http-equiv="cache-control" content="no-cache">  
  15.     <meta http-equiv="expires" content="0">      
  16.     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
  17.     <meta http-equiv="description" content="This is my page">   
  18.   </head>  
  19.     
  20.   <body>  
  21.     用户登陆 <br>  
  22.      ${SPRING_SECURITY_LAST_EXCEPTION.message}  
  23.       <form action="j_spring_security_check" method="post">  
  24.         USERNAME:<input type="text" name="j_username" value="${sessionScope['SPRING_SECURITY_LAST_USERNAME']}" /><br/>  
  25.         PASSWORD:<input type="password" name="j_password" value="" /><br/>  
  26.         <input type="checkbox" name="_spring_security_remember_me" />两周之内不必登陆(这个功能没有做的)<br/>  
  27.         <input type="submit">       
  28.     </form>  
  29.   </body>  
  30. </html>  

 

这里我还是使用Spring Security默认的j_username和j_password,表单目标也用默认的j_spring_security_check,会默认跳到Spring Security进行拦截。其他的应该不用解释了吧。。。。

 

最后 ,我们整理一下Spring Security的整个控制过程:

 

——>用户登陆

——> <security:authentication-manager> 拦截

——>交给customUserDetailsService处理,并且声明密码采用MD5策略

——>根据输入的用户名去数据库查这条记录,验证身份

——>取出该条记录的用户权限(锁定、禁用、过期和实际权限等)

——>根据取得的权限列表去security:intercept-url匹配、授权,然后判断是否放行。

这就完成了一整个的权限控制流程。

 

接下来我们来测试一下看是否真的生效了:

1、测试匿名访问页面,直接地址栏访问:

 

 

 

 

 

2、普通用户登陆



  

 

 

 

然后访问后台管理页面,跳回了登陆页



 

 

 

 

 

3、管理员用户登陆

 

 

 

 

退出后成功跳转回登陆页,点击后退再执行其他操作,这时候session已经注销了的,不能执行,又跳回了登陆页。是我们想要的效果,OK,成功了。

 

 

 好了,Spring Security的简单使用就讲到这里,其实这只是Spring Security的一小部分,而且这里我还没有用权限表对用户权限进行专门的管理,很多东西还是用Spring Security 默认的,还有Spring Security CAS (单点登陆)以及更加高级的权限控制和更完善的Spring Security 配置,以后我们再慢慢去研究吧。发现Spring Security 这个技术不仅简化了我们的用户权限管理,要知道我们做管理系统的时候这是个大问题,也差不多颠覆了我一贯以来用户权限管理的观念,但是掌握了这种思维之后,又发现,其实,程序并不是只有一种实现方式,它激发了我写程序时要去寻找多种解决方案的想法。学习的路上,就是要不断推翻自己固有的思维,去见识多种新事物,才能有进步。

Spring Security详解(四)认证之鉴权 4 鉴权 从Spring Security的过滤器链中,我们已经发现位于最后的FilterSecurityInterceptor是用来进行权限认证的,这一节将详细分析Spring Security是如何进行权限认证的。 4.1 FilterSecurityInterceptor 源码分析: public class FilterSecurityInterceptor exten... 阅读详情

相关推荐

Spring Security 实战内容:Spring Boot 中的 Spring Security 自动配置初探

1. 前言 我们发现 Spring Security Starter相关的 Servlet 自动配置都在spring-boot-autoconfigure-2.1.9.RELEASE(当前 Spring Boot 版本为2.1.9.RELEASE) 模块的路径org.springframework.boot.autoconfigure.security.servlet 之下。其实官方提供的Starter组件的自动配置你都能在spring-boot-autoconfigure-2.1.9.RELEASE下找.

V539413949的博客 710

【Spring Security OAuth2笔记系列】- Spring Social第三方登录 - 单机session管理

单机session管理 到目前为止三个功能: 用户名 + 密码登录 手机号 + 短信登录 社交网站登录 前两种使用表单提交方式完成,后一种使用oath授权完成; 虽然表现方式和处理流程不同,但是有一个共同点,认证后的用户信息是存放在session中的; session超时 如何管理超时时间 超时后如何处理 session并发 : a 机器登录,又在b机器登录的场景下,只运行一台机...

代码有毒的博客 1445

揭秘 | 顶刊论文插图中的高级配色方案(附RGB/HEX码解析)

本文揭秘了顶级期刊如《Nature》《Science》插图的高级配色方案,详细解析了RGB/HEX码的应用技巧。从双色配色的黄金组合到复杂数据可视化的多色解决方案,提供了实用的配色法则和跨平台一致性建议,帮助科研人员提升图表专业度和视觉传达效果。

weixin_28523493的博客 990

安全管理一

今天要讲的内容: 简单列子 自定义登录界面 数据库管理权限(系统默认) IS_AUTHENTICATED_ANONYMOUSLY与IS_AUTHENTICATED_FULLY login.jsp增加登录失败提示信息 一:简单列子    第一步jar包准备               第二步在web.xml中配置过滤器 &lt;filter&gt; &l...

一元钱计划 247

单精度浮点数存储、双精度浮点数存储

单精度浮点数存储、双精度浮点数存储

fancynthia的博客 1322

C# 开发 WPS 插件实战:从环境搭建到功能实现(附完整代码)

本文提供了一份详尽的C#开发WPS插件实战指南,涵盖从环境搭建到功能实现的完整流程。通过COM技术,开发者可以创建自定义插件,为WPS Office扩展自动化功能,如文档处理与格式转换。文章包含核心概念解析、Ribbon界面集成、调试部署方法及完整代码示例,帮助开发者快速上手。

rust6ferris的博客 928

初探 Spring Security

前言在當今瞬息萬變的 Web 環境中,應用程式安全比以往任何時候都更加重要。為保護服務、資料等各項資源,不被任意存取。Spring 提供了 Spring Security 驗證框架,它能幫助我們開發有關認證與授權等有關安全管理的功能。下面讓我們透過簡單的例子初窺如何運用。專案實作註: 基於 初探 Vue 與 Spring boot 的對話之Backend (SpringBoot-Backend)文章 專案延生1. 新增 相關 Dependencies Pom.xml 備註:spring-security

2301_78959703的博客 904

Unity引擎开发:复杂动作系统_动作捕捉数据的应用与整合

通过以上步骤,我们可以在Unity中有效地应用和整合动作捕捉数据,以实现更加真实和流畅的动画效果。从导入文件格式的选择,到预处理和优化,再到实时应用和调试验证,每一步都至关重要。希望本文能帮助你在Unity项目中更好地利用动作捕捉数据,提升动画质量和性能。

chenlz2007的博客 961

Spring全家桶-Spring Security初探

Spring全家桶-Spring Security 初探 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC(控制反转),DI(依赖注入)和AOP(面向切面编程)功能,为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代码的工作。 文章目录Spring全家桶-Spring Security 初探一、Spring Securit

HQ DevJ的专栏 835

在 SAP 中启用应收/应付“代扣税(Withholding Tax)”功能,本质上是激活并配置“扩展代扣税(Extended Withholding Tax)”模型

摘要:SAP中启用应收/应付代扣税功能需完成3个层级12个核心步骤:1)全局激活公司代码代扣税功能;2)配置代扣税规则、税率和科目,包括定义税种类型、代码、总账科目等;3)在供应商/客户主数据中关联代扣税设置。完成后系统可在发票或付款环节自动计算并过账代扣税,支持多税种并行计算和税率年度调整,最终生成税务报表。常见问题排查需检查公司代码激活状态和主数据配置。(149字)

金牌架构师 836

Autodesk Revit软件二次开发:Revit二次开发中的插件设计与实现

在 Revit 中,族是构成建筑模型的基本单元,可以是门窗、家具等。通过自定义族,可以创建符合特定需求的建筑构件。参数化设计允许族的尺寸、形状等属性根据参数变化而变化。使用 Revit API 创建自定义族涉及多个步骤,包括定义族类型、设置参数、创建几何形状等。// 创建族文档// 定义参数Parameter param = family.FamilyManager.AddParameter("Width", BuiltInParameterGroup.PG_LENGTH, "宽度");

kkchenjj的博客 2232

Java实习生小渣的Spring Security初探:从权限控制到JWT实战

通过今天的学习,小渣了解了Spring Security的基础权限控制机制,以及如何结合JWT实现无状态认证,适合分布式微服务环境。互联网大厂的安全策略非常重视认证与授权,掌握这些技术能帮助我们写出更安全、健壮的Java应用。下一次,小渣计划和mentor探讨Spring Cloud微服务中的服务安全与服务注册认证,敬请期待!希望本文对刚入门Spring Security的小伙伴有所帮助,欢迎留言交流~

m0_59004289的博客 490

YOLO11创新改进系列:卷积,主干 注意力,C3k2融合,检测头等创新机制(已更新110+)

本专栏提供详细的 YOLO11 教程,包括基础知识、源码解析、入门实践、算法改进和项目实战,适合发表YOLO11 学习者订阅。内容包含 100+多篇独家改进机制,适合发表论文,评分高达 96 分。订阅者将获得一键运行的改进文件及答疑交流群支持。 使用服务器的同学还可以私聊获取搭建好的运行环境。

专注于图像领域,主要研究内容包括计算机视觉和深度学习,特别是在图像分类、目标检测和图像生成等方面有深入的研究和实践经验。 1万+

spring security 初探,UserDetails相关解析

spring security 系列学习

xzjayx的博客 1854

2026全网最新华为OD机试真题目录A+B+C+D+E卷(持续收录中)-Python版

🔔本文收录于「最新最全华为OD机试真题(Python版)」专栏,手把手带你零基础教学华为OD机试。本题集提供最优题解思路,解题步骤,代码解析,复杂度分析及最优题解源码等,支持多语言题解,助你轻松拿捏OD机考,一举上岸!安利大家关注&&收藏&&订阅!题库正在疯狂收录中,up!up!up!! 🚫提醒:拒绝一切代考/替考,违法必究!本人所写题库均精心搜集于互联网。    💗订阅福利:一次订阅,可永久免费阅读,提供在线答疑解惑,后续题库更新皆可阅读使用!

**My Coding Family** 10万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

【Spring Security】spring security 之初探jwt

初探jwt Spring Security 提供对JWT的支持,我们使用Spring Security 提供的JwtHelper来创建JWT令牌,校验JWT令牌 等操作 1.1生成私钥和公钥 JWT令牌生成采用非对称加密算法 生成密钥证书 下边命令生成密钥证书,采用RSA 算法每个证书包含公钥和私钥 keytool -genkeypair -alias batman -keyalg RSA ...

batman 547

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

初探Spring Security

一、简介 Spring Security是Spring社区的一个顶级项目,也是 Spring Boot官方推荐使用的Security框架。除了常规的 Authentication和Authorization之外,Spring Security还 提供了诸如ACLs,LDAP,JAAS,CAS等高级特性以满足复杂场景下的安全需求 二、理解 1、从AAA说起 【中文名称】:鉴权、授权和计费

Y-CAT的专栏 1147

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

springboot集成spring security初探

很重要的一点:登录页面的 url和登录按钮提交的 url 要一致。否则,是不会进入到UserDetailService 的loadUserByUsername 方法中的。 第一步:引入 security 到项目中 org.springframework.boot spring-boot-starter-security 第二步:实现 自己的Security

iamletian 2331

Spring Security初探

Spring Security这个框架是为基于权限的安全提供解决方案的,它能够基于权限来

VincenLlin的专栏 794

Spring Security 初探

这两天在看spring security, 写些tips: 1. 作为业界最成熟的AA(Authentication & Authorization)框架, 目测其采用了Apache Shiro 2. 与通用做法一样,其AA做在了Filter 层 而非 Servlet层 3. 其本质上是一个filtechain 4. 利用两种工具达到AA控制的目的: a. 过滤器filters. b. ...

gongzixiang的专栏 159

01.spring security项目初探

1. 创建项目 IDE工具:IntelliJ IDEA jdk:1.8 spirngboot version:2.1.1.RELEASE 创建springboot项目, 依赖选择web、security &lt;dependency&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;arti...

Y_seventeen 158

spring security初探之授权原理源码解析

说说授权 授权的定义是:判断某用是否拥有访问某资源的权限。我们这里说的资源被定义为URL(当然也可以是方法,但这不在我们讨论的范围内),权限我们这里定义为角色,那么对授权的定义我们就转化成,判断用户是否拥有访问某条URL的角色。一个用户可以对应多个角色,一个角色可以对应多个资源,这样我们的假设就出来了。 对授权过程的假设 我们可以知道,在认证过程中,用户信息生成的Authentication

cjのice_bear 1930
上一篇: 编码史记
下一篇: Spring如何实现IOC与AOP的
VagueCoder
博客等级 码龄13年 4粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值