- 浏览: 250379 次
- 性别:
- 来自: 苏州
文章分类
- 全部博客 (289)
- java (72)
- oracle (3)
- mysql (5)
- spring (28)
- hibernate (2)
- osgi (0)
- linux (2)
- ExtJs (1)
- jvm (0)
- mybatis (7)
- 分布式 (11)
- MINA (6)
- apache+tomcat (13)
- js+htm (7)
- android (44)
- http (1)
- hbase+hdoop (0)
- memcache (13)
- search (27)
- 部署及性能 (12)
- mongoDB (2)
- 多线程 (12)
- 安全管理验证 (9)
- struts (1)
- webservice (0)
- easyUI (1)
- spring security (16)
- pattern (6)
- 算法 (2)
最新评论
-
lzh8189146:
CommonsHttpSolrServer这个类,现在是不是没 ...
CommonsHttpSolrServer -
xiaochanzi:
我按照你的方法试了下,tomcat6可以发布,但是访问任何网页 ...
基于内嵌Tomcat的应用开发 -
phoneeye:
麻烦你,如果是抄来的文章,请给出来源。谢谢
ant 两则技巧 -
neverforget:
转载不注明出处
Spring Security3.1登陆验证 替换 usernamepasswordfilter -
liang1022:
若不使用eclipse ,如何在命令行下 运行服务端程序 ?
WebService CXF学习(入门篇2):HelloWorld
Java代码 <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><context-param> <param-name>contextConfigLocation</param-name><param-value>classpath:spring.xml</param-value></context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener </listener-class></listener> Java代码 <?xmlversion="1.0" encoding="UTF-8"?><beans:beansxmlns="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/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://www.springframework.org/schema/securityhttp://www.springframework.org/schema/security/spring-security-3.0.xsd"></beans:beans> Java代码 <httpauto-config="true"> <intercept-url pattern="/**"access="ROLE_USER" /> </http> <authentication-manager><authentication-provider> <user-service> <username="tom" password="123" authorities="ROLE_USER,ROLE_A" /> <user name="jerry" password="123"authorities="ROLE_USER, ROLE_B" /> </user-service></authentication-provider> </authentication-manager> Java代码 <authentication-manager><authentication-provider> <password-encoder hash=“md5”/><jdbc-user-service data-source-ref="dataSource"/></authentication-provider> </authentication-manager> 数据表结构见SS说明手册附录A Java代码 <httpauto-config="true"> <intercept-url pattern="/js/**"filters="none"/> <intercept-url pattern="/css/**"filters="none"/> <intercept-url pattern="/images/**"filters="none"/> <intercept-url pattern="/a.jsp"access="ROLE_A" /> <intercept-url pattern="/b.jsp"access="ROLE_B" /> <intercept-url pattern="/c.jsp"access="ROLE_A, ROLE_B" /> <intercept-urlpattern="/**" access="ROLE_USER" /> </http> Java代码 <httpauto-config="true"> <!-- 指定登陆页面、成功页面、失败页面--> <form-loginlogin-page="/login.jsp" default-target-url="/index.jsp"authentication-failure-url="/login.jsp" /> <!-- 尝试访问没有权限的页面时跳转的页面 --> <access-denied-handlererror-page="/accessDenied.jsp"/> <!-- 使用记住用户名、密码功能,指定数据源和加密的key --> <remember-me data-source-ref="dataSource"/> <!-- logout页面,logout后清除session --> <logout invalidate-session="true"logout-success-url="/login.jsp" /> <!-- session 失效后跳转的页面,最大登陆次数 --> <session-managementinvalid-session-url="/sessionTimeout.htm"> <concurrency-controlmax-sessions="1" expired-url="/sessionTimeout.htm" /></session-management> </http> 可以使用SS自带的登陆页面作为login.jsp的模板 Java代码 <!-- 加载错误信息资源文件 --><beans:bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"><beans:property name="basename"value="classpath:messages"/> </beans:bean> 资源文件在SS核心包:spring-security-core-3.0.2.RELEASE.jar的orgspringframeworksecurity目录中 Java代码 方式一:Java代码 Authentication auth =SecurityContextHolder.getContext().getAuthentication();Collection<GrantedAuthority> col = auth.getAuthorities(); 方式二:标签库 <%@ taglib prefix="sec"uri="http://www.springframework.org/security/tags" %><sec:authentication property="name“/> <sec:authenticationproperty="authorities“/> Java代码 方式一<sec:authorizeifAnyGranted="ROLE_A"> <ahref="a.jsp">你可以访问a.jsp</a></sec:authorize> <sec:authorizeifNotGranted="ROLE_A"> 你不可以访问a.jsp </sec:authorize> 方式二<sec:authorizeurl="/a.jsp"> <a href="a.jsp">你可以访问a.jsp</a> </sec:authorize> Java代码 <global-method-securitypre-post-annotations="enabled"> <protect-pointcutexpression="execution(* com.xasxt.*Service.add*(..))"access="ROLE_A"/> <protect-pointcutexpression="execution(* com.xasxt.*Service.delete*(..))"access="ROLE_B"/> </global-method-security> 此处使用了AspectJ中常用的切入点表达式(百度:AspectJ execution) Java代码 public class DemoService {@PreAuthorize("hasRole('ROLE_A')") public voidmethodA() { } @PreAuthorize("hasAnyRole('ROLE_A, ROLE_B')")public void methodB() { } } hasRole与hasAnyRole为SS通用内置表达式(google : spring security Common Built-In Expressions) 20.本Blog所有内容不得随意转载,版权属于作者所有。如需转载请与作者联系(fastzch@163.com QQ:9184314)。 21. <?xml version="1.0" encoding="UTF-8"?> 22.这个文件中的内容我相信大家都很熟悉了,不再多说了。 23. <?xml version="1.0" encoding="UTF-8"?> 24. 25. package com.robin.erp.fwk.security; 26.最核心的代码就是invoke方法中的InterceptorStatusToken token = super.beforeInvocation(fi);这一句,即在执行doFilter之前,进行权限的检查,而具体的实现已经交给accessDecisionManager了,下文中会讲述。 27. package com.robin.erp.fwk.security; 28.在这个类中,你就可以从数据库中读入用户的密码,角色信息,是否锁定,账号是否过期等,我想这么简单的代码就不再多解释了。 29. package com.robin.erp.fwk.security; 30.看看loadResourceDefine方法,我在这里,假定index.jsp和i.jsp这两个资源,需要ROLE_ADMIN角色的用户才能访问。 31. package com.robin.erp.fwk.security; 32.在这个类中,最重要的是decide方法,如果不存在对该资源的定义,直接放行;否则,如果找到正确的角色,即认为拥有权限,并放行,否则throw new AccessDeniedException("no right");这样,就会进入上面提到的403.jsp页面。
11个步骤为应用程序添加安全防护
自2003年出现的Spring扩展插件Acegi Security发展而来。
目前最新 版本为3.x,已成为Spring的一部分。
为J2EE企业应用程序提供可靠的安全性服务。
区分概念验证与授权
验证
这 个用户是谁?
用户身份可靠吗?
授权
某用户A是否可以访问资源R
某用户A是否可以执行M操作
某用户A是否可以对资 源R执行M操作
支持多种验证方式
支持多种加密格式
支持组件的扩展和替换
可以本地化 输出信息
支持多种仲裁方式
支持组件的扩展和替换
支持对页面访问、方法访问、对象访问 的授权。
Web安全
通过配置Servlet Filter激活SS中的过滤器链
实现 Session一致性验证
实现免登陆验证(Remember-Me验证)
提供一系列标签库进行页面元素的安全控制
方法安全
通 过AOP模式实现安全代理
Web安全与方法安全均可以使用表达式语言定义访问规则
配置Web.xml,应用安全过滤器
配置Spring,验证与授权部分
在web页面 中获取用户身份
在web页面中应用安全标签库
实现方法级安全
拷贝本地化资源文件后,在配置文件中加载该文件:
采用更安全的验证方式
采用安全的数据传输方式
实现动态授权
自 定义验证与授权部件
实现数据级安全
未经许可的转载,本人保留一切法律权益。
一直以来,发现有某些人完全不尊重我的劳动成果,随意转载,提醒一下那些人小心哪天惹上官司。
Spring Security 3.x 出来一段时间了,跟Acegi是大不同了,与2.x的版本也有一些小小的区别,网上有一些文档,也有人翻译Spring Security 3.x的guide,但通过阅读guide,无法马上就能很容易的实现一个完整的实例。
我花了点儿时间,根据以前的实战经验,整理了一份完整的入门教程,供需要的朋友们参考。
1,建一个web project,并导入所有需要的lib,这步就不多讲了。
2,配置web.xml,使用Spring的机制装载:
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext*.xml</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<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>
<welcome-file-list>
<welcome-file>login.jsp</welcome-file>
</welcome-file-list>
</web-app>
2,来看看applicationContext-security.xml这个配置文件,关于Spring Security的配置均在其中:
<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-3.0.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.0.xsd">
<http access-denied-page="/403.jsp"><!-- 当访问被拒绝时,会转到403.jsp -->
<intercept-url pattern="/login.jsp" filters="none" />
<form-login login-page="/login.jsp"
authentication-failure-url="/login.jsp?error=true"
default-target-url="/index.jsp" />
<logout logout-success-url="/login.jsp" />
<http-basic />
<!-- 增加一个filter,这点与Acegi是不一样的,不能修改默认的filter了,这个filter位于FILTER_SECURITY_INTERCEPTOR之前 -->
<custom-filter before="FILTER_SECURITY_INTERCEPTOR"
ref="myFilter" />
</http>
<!-- 一个自定义的filter,必须包含authenticationManager,accessDecisionManager,securityMetadataSource三个属性,
我们的所有控制将在这三个类中实现,解释详见具体配置 -->
<beans:bean id="myFilter" class="com.robin.erp.fwk.security.MyFilterSecurityInterceptor">
<beans:property name="authenticationManager"
ref="authenticationManager" />
<beans:property name="accessDecisionManager"
ref="myAccessDecisionManagerBean" />
<beans:property name="securityMetadataSource"
ref="securityMetadataSource" />
</beans:bean>
<!-- 认证管理器,实现用户认证的入口,主要实现UserDetailsService接口即可 -->
<authentication-manager alias="authenticationManager">
<authentication-provider
user-service-ref="myUserDetailService">
<!-- 如果用户的密码采用加密的话,可以加点“盐”
<password-encoder hash="md5" />
-->
</authentication-provider>
</authentication-manager>
<beans:bean id="myUserDetailService"
class="com.robin.erp.fwk.security.MyUserDetailService" />
<!-- 访问决策器,决定某个用户具有的角色,是否有足够的权限去访问某个资源 -->
<beans:bean id="myAccessDecisionManagerBean"
class="com.robin.erp.fwk.security.MyAccessDecisionManager">
</beans:bean>
<!-- 资源源数据定义,即定义某一资源可以被哪些角色访问 -->
<beans:bean id="securityMetadataSource"
class="com.robin.erp.fwk.security.MyInvocationSecurityMetadataSource" />
</beans:beans>
3,来看看自定义filter的实现:
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import org.springframework.security.access.SecurityMetadataSource;
import org.springframework.security.access.intercept.AbstractSecurityInterceptor;
import org.springframework.security.access.intercept.InterceptorStatusToken;
import org.springframework.security.web.FilterInvocation;
import org.springframework.security.web.access.intercept.FilterInvocationSecurityMetadataSource;
public class MyFilterSecurityInterceptor extends AbstractSecurityInterceptor
implements Filter {
private FilterInvocationSecurityMetadataSource securityMetadataSource;
// ~ Methods
// ========================================================================================================
/** *//**
* Method that is actually called by the filter chain. Simply delegates to
* the {@link #invoke(FilterInvocation)} method.
*
* @param request
* the servlet request
* @param response
* the servlet response
* @param chain
* the filter chain
*
* @throws IOException
* if the filter chain fails
* @throws ServletException
* if the filter chain fails
*/
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
FilterInvocation fi = new FilterInvocation(request, response, chain);
invoke(fi);
}
public FilterInvocationSecurityMetadataSource getSecurityMetadataSource() {
return this.securityMetadataSource;
}
public Class<? extends Object> getSecureObjectClass() {
return FilterInvocation.class;
}
public void invoke(FilterInvocation fi) throws IOException,
ServletException {
InterceptorStatusToken token = super.beforeInvocation(fi);
try {
fi.getChain().doFilter(fi.getRequest(), fi.getResponse());
} finally {
super.afterInvocation(token, null);
}
}
public SecurityMetadataSource obtainSecurityMetadataSource() {
return this.securityMetadataSource;
}
public void setSecurityMetadataSource(
FilterInvocationSecurityMetadataSource newSource) {
this.securityMetadataSource = newSource;
}
@Override
public void destroy() {
}
@Override
public void init(FilterConfig arg0) throws ServletException {
}
}
4,来看看authentication-provider的实现:
import java.util.ArrayList;
import java.util.Collection;
import org.springframework.dao.DataAccessException;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.GrantedAuthorityImpl;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
public class MyUserDetailService implements UserDetailsService {
@Override
public UserDetails loadUserByUsername(String username)
throws UsernameNotFoundException, DataAccessException {
Collection<GrantedAuthority> auths=new ArrayList<GrantedAuthority>();
GrantedAuthorityImpl auth2=new GrantedAuthorityImpl("ROLE_ADMIN");
auths.add(auth2);
if(username.equals("robin1")){
auths=new ArrayList<GrantedAuthority>();
GrantedAuthorityImpl auth1=new GrantedAuthorityImpl("ROLE_ROBIN");
auths.add(auth1);
}
// User(String username, String password, boolean enabled, boolean accountNonExpired,
// boolean credentialsNonExpired, boolean accountNonLocked, Collection<GrantedAuthority> authorities) {
User user = new User(username,
"robin", true, true, true, true, auths);
return user;
}
}
5,对于资源的访问权限的定义,我们通过实现FilterInvocationSecurityMetadataSource这个接口来初始化数据。
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.springframework.security.access.ConfigAttribute;
import org.springframework.security.access.SecurityConfig;
import org.springframework.security.web.FilterInvocation;
import org.springframework.security.web.access.intercept.FilterInvocationSecurityMetadataSource;
import org.springframework.security.web.util.AntUrlPathMatcher;
import org.springframework.security.web.util.UrlMatcher;
/** *//**
*
* 此类在初始化时,应该取到所有资源及其对应角色的定义
*
* @author Robin
*
*/
public class MyInvocationSecurityMetadataSource
implements FilterInvocationSecurityMetadataSource {
private UrlMatcher urlMatcher = new AntUrlPathMatcher();;
private static Map<String, Collection<ConfigAttribute>> resourceMap = null;
public MyInvocationSecurityMetadataSource() {
loadResourceDefine();
}
private void loadResourceDefine() {
resourceMap = new HashMap<String, Collection<ConfigAttribute>>();
Collection<ConfigAttribute> atts = new ArrayList<ConfigAttribute>();
ConfigAttribute ca = new SecurityConfig("ROLE_ADMIN");
atts.add(ca);
resourceMap.put("/index.jsp", atts);
resourceMap.put("/i.jsp", atts);
}
// According to a URL, Find out permission configuration of this URL.
public Collection<ConfigAttribute> getAttributes(Object object)
throws IllegalArgumentException {
// guess object is a URL.
String url = ((FilterInvocation)object).getRequestUrl();
Iterator<String> ite = resourceMap.keySet().iterator();
while (ite.hasNext()) {
String resURL = ite.next();
if (urlMatcher.pathMatchesUrl(url, resURL)) {
return resourceMap.get(resURL);
}
}
return null;
}
public boolean supports(Class<?> clazz) {
return true;
}
public Collection<ConfigAttribute> getAllConfigAttributes() {
return null;
}
}
这个类中,还有一个最核心的地方,就是提供某个资源对应的权限定义,即getAttributes方法返回的结果。注意,我例子中使用的是AntUrlPathMatcher这个path matcher来检查URL是否与资源定义匹配,事实上你还要用正则的方式来匹配,或者自己实现一个matcher。
6,剩下的就是最终的决策了,make a decision,其实也很容易,呵呵。
import java.util.Collection;
import java.util.Iterator;
import org.springframework.security.access.AccessDecisionManager;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.security.access.ConfigAttribute;
import org.springframework.security.access.SecurityConfig;
import org.springframework.security.authentication.InsufficientAuthenticationException;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
public class MyAccessDecisionManager implements AccessDecisionManager {
//In this method, need to compare authentication with configAttributes.
// 1, A object is a URL, a filter was find permission configuration by this URL, and pass to here.
// 2, Check authentication has attribute in permission configuration (configAttributes)
// 3, If not match corresponding authentication, throw a AccessDeniedException.
public void decide(Authentication authentication, Object object,
Collection<ConfigAttribute> configAttributes)
throws AccessDeniedException, InsufficientAuthenticationException {
if(configAttributes == null){
return ;
}
System.out.println(object.toString()); //object is a URL.
Iterator<ConfigAttribute> ite=configAttributes.iterator();
while(ite.hasNext()){
ConfigAttribute ca=ite.next();
String needRole=((SecurityConfig)ca).getAttribute();
for(GrantedAuthority ga:authentication.getAuthorities()){
if(needRole.equals(ga.getAuthority())){ //ga is user's role.
return;
}
}
}
throw new AccessDeniedException("no right");
}
@Override
public boolean supports(ConfigAttribute attribute) {
// TODO Auto-generated method stub
return true;
}
@Override
public boolean supports(Class<?> clazz) {
return true;
}
}
参考资料:
1,Spring官方网站:http://www.springframework.org
2,文章所用的代码,MyEclipse工程,去掉了lib,请自行下载Spring Security 3.x的包,并copy至对应目录。工程源代码
3,根据网络上的资料,制作的CHM版的Spring Security 3.x 参考手册中文版
4,2009年3月,我在“IBM WebSphere技术专家沙龙(华南区广州站)”演讲时的PPT:《Spring Security--Protect your webapplication》,当时是Spring Security 2.x,很多原理是一样,可作参考。
教程中为了尽可能不跟其它框架关联上,所以去掉了访问数据库的部分,比如用户信息和资源配置信息的读取,直接写死在代码中了,大家可以根据自己的实际情况补充完整。
如有任何疑问,欢迎大家以评论的方式提问,也欢迎大家讨论!
发表评论
-
在spring security3上实现验证码
2012-04-21 16:07 613在spring security3上实现验证码 h ... -
Spring Security3.1登陆验证 替换 usernamepasswordfilter
2012-04-15 02:01 3371一、前言 在上一篇http://blog.c ... -
在spring security3上实现验证码
2012-03-01 08:44 601转载: 在spring securi ... -
spring security 密码编码器
2012-03-14 08:13 932spring security 密码编码器 (2 ... -
spring security 配置详解
2012-02-25 11:50 2138http://static.springsource.org/ ... -
图解Spring Security默认使用的过滤器
2012-02-24 08:13 743转载:http://www.flyysoft.com/plus ... -
Spring Security 3 与 CAS单点登录配置-Server
2012-03-15 19:56 1257转载:http://www.hxdw.com/bbs/post ... -
Topic: Spring Security 3 与 CAS单点登录配置-Client
2012-02-26 12:12 791转载: http://www.hxdw.com ... -
Spring Security 可动态授权RBAC权限模块实践
2012-02-19 13:25 2014Spring Security 可动态授权RBA ... -
Spring Security 3 基于角色访问控制过程详解
2012-02-19 13:25 1374访问控制:由于我们配 ... -
修改spring security源码实现动态授权
2012-02-21 08:15 886修改spring security源码实现动态 ... -
spring security 3.0 logout filter 代码中的一个小bug
2012-03-15 19:57 963spring security 3.0 log ... -
spring security 源码分析: 过滤器
2012-03-19 08:23 982spring security 源码分析: 过 ... -
spring security遇到的一些问题
2012-03-19 08:24 636spring security遇到的一些问题 ... -
spring security 源码解读 1
2012-03-19 08:24 835http://feiyan35488.iteye.com/bl ...
相关推荐
11个步骤为应用程序添加安全防护 2. 历史与现状 自2003年出现的Spring扩展插件Acegi Security发展而来。 目前最新 版本为3.x,已成为Spring的一部分。 为J2EE企业应用程序提供可靠的安全性服务。
Spring_Security_3应用的11个步骤.docx
技术分享:Spring_Security_3应用的11个步骤
Spring_Security安全框架的简单应用步骤Spring_Security安全框架的简单应用步骤Spring_Security安全框架的简单应用步骤
1.1. Spring Security是什么? 1.2. 历史 1.3. 发行版本号 1.4. 获得Spring Security 1.4.1. 项目模块 1.4.1.1. Core - spring-security-core.jar 1.4.1.2. Web - spring-security-web.jar 1.4.1.3. ...
本文将详细阐述Spring Security的原理、使用方法以及步骤,并通过一个完整的示例来展示如何在Spring Boot项目中集成Spring Security。我们将从Spring Security的基本概念开始,逐步深入到配置和使用,确保读者能够...
这次发布的Spring Security-3.0.1 是一个bug fix 版,主要是对3.0 中存在的一些问题进 行修 正。文档中没有添加新功能的介绍,但是将之前拼写错误的一些类名进行了修正,建议开发 者以这一版本的文档为参考。 ...
从Spring-2.0开始可以使用命名空间的配置方式。 使用它呢,可以通过附加xml架构,为传统的spring beans应用... 比如,把下面的security命名元素添加到应用环境中,将会为测试用途,在应用内部启动一个内嵌LDAP服务器:
Spring Security 3rd Edition自述文件该自述文件通常将记录启动和运行应用程序所需的所有步骤。JBCP日历应用程序Jim Bob CP日历应用程序4.00.00快照该代码已在开发,并且每个章节里程碑都有一个子项目。 在整本书中...
使用Spring Boot,Spring Security,JWT,React和Ant Design构建类似于Twitter民意测验的Full Stack Polls应用程序 讲解 我在CalliCoder博客上为此应用程序编写了完整的教程系列- 设置Spring Boot Back end app...
响应式Spring Security 5研讨会这是一个动手实践研讨会,内容涉及使用Spring Security 5.x保护基于响应式Spring Boot 2.x的Web应用程序。介绍话题该研讨会将涉及的主题是: 使用和基本概念(即安全性Web筛选器链) ...
使用Spring Boot,Spring Security,JWT构建类似于Twitter民意测验的Full Stack Polls应用程序 设置Spring Boot Back end app(polling-app-server)的步骤 克隆应用 git clone ...
基于 Spring Boot 的设备管理系统是一个用于管理设备信息和进行设备操作的应用程序。它使用 Spring Boot 框架来构建后端服务,并提供了 RESTful API 接口以与前端或其他客户端进行通信。 以下是创建基于 Spring ...
在您的 grails 应用程序中创建一个新域 AuthToken,它将在用户登录 AuthToken.groovy 时存储身份验证令牌 class AuthToken { String username // this field will store username of the authentica
本教程分析了 Spring Web Flow 2.0 的技术要点,并且通过创建一个示例应用程序,展示了 Spring Web Flow 2.0 的基本知识。 开始之前 关于本教程 本教程通过一个简化的购物车应用,介绍了如何使用 Spring Web Flow ...
14.1 用Spring Portlet MVC开发一个简单的Portlet 544 14.1.1 问题 544 14.1.2 解决方案 545 14.1.3 工作原理 546 14.2 将Portlet请求映射到处理程序 553 14.2.1 问题 553 14.2.2 解决方案 553 14.2.3...
Springboot-脚手架-项目这是一个脚手架项目:使用Nginx,Spring Boot,Spring Security,JWT,React和Ant Design构建的Full Stack App,最后通过Docker进行部署。设置Spring Boot Back end app(blog-app-server)的...
s2oauth 适用于Grails 3的POC Spring Security + OAuth插件 Grails 2插件的主要区别: 不再依赖但该插件的一些代码已移植到此目前(没有)域类和数据库持久性最简单的代码储存库结构为了加快开发速度,有一个单独的...
Grails-Springsecurity-username-email-login 此种子用于在您的应用程序中配置 spring 安全性并启用使用用户名或电子邮件登录 vai Grails spring 安全性插件仅支持通过用户名登录。 如果您需要通过用户名或密码启用...