ss3ex与Lingo,ss3中spring security2使用的差别

spring security2中实现数据库管理认证和授权,版本号是spring security2.0.4,为简述方便,本文只列举关键代码。
认证:
<authentication-provider user-service-ref="userDetailsService">
<password-encoder hash="md5">
<salt-source user-property="username" />
</password-encoder>
</authentication-provider>

其中userDetailsService类的实现:
public UserDetails loadUserByUsername(String userName)
throws UsernameNotFoundException, DataAccessException {
User user = securityManager.findUserByLoginName(userName);
if (user == null)
throw new UsernameNotFoundException("用户" + userName + " 不存在");
GrantedAuthority[] grantedAuths = obtainGrantedAuthorities(user);
// san中无以下属性,暂时全部设为true.
boolean enabled = true;
boolean accountNonExpired = true;
boolean credentialsNonExpired = true;
boolean accountNonLocked = true;
org.springframework.security.userdetails.User userdetail = new

org.springframework.security.userdetails.User(
user.getLoginName(), user.getPassword(), enabled,
accountNonExpired, credentialsNonExpired, accountNonLocked,
grantedAuths);
return userdetail;
}

obtainGrantedAuthorities类的实现:
第一种,GrantedAuthority中存放的是role表中的name。
/**
* 获得用户所有角色的权限集合.
*/
private GrantedAuthority[] obtainGrantedAuthorities(User user) {
List<GrantedAuthority> authsList = new ArrayList<GrantedAuthority>();
GrantedAuthority ag=null;
List<Role> roleList=userService.getRoleByLoginName(userName);
for (Role role : roleList) {
ag=new GrantedAuthorityImpl(role.getName());
authsList.add(ag);
ag=null;
}
return authSet.toArray(new GrantedAuthority[authsList.size()]);
}

第二种,GrantedAuthority中存放的是reresource表中的name。
/**
* 获得用户所有角色的权限集合.
*/
private GrantedAuthority[] obtainGrantedAuthorities(User user) {
List<GrantedAuthority> authsList = new ArrayList<GrantedAuthority>();
GrantedAuthority ag=null;
for (Role role : user.getRoles()) {
for(Resource res:role.getResources()){
ag=new GrantedAuthorityImpl(res.getName());
authsList.add(ag);
ag=null;
}
}
return authSet.toArray(new GrantedAuthority[authsList.size()]);
}

授权:
有2种实现,一是新写了一个FactoryBean,向默认的DefaultFilterInvocationDefinitionSource注入从ResourceDetailService中返回的RequestMap。
<beans:bean id="filterSecurityInterceptor"		class="org.springframework.security.intercept.web.FilterSecurityInterceptor">
<custom-filter before="FILTER_SECURITY_INTERCEPTOR" />
<beans:property name="authenticationManager" ref="authenticationManager" />
<beans:property name="accessDecisionManager" ref="accessDecisionManager" />
<beans:property name="objectDefinitionSource" ref="databaseDefinitionSource" />
</beans:bean>
<!-- DefinitionSource工厂,使用resourceDetailsService提供的URL-授权关系. -->
<beans:bean id="databaseDefinitionSource"
class="san.service.Impl.DefinitionSourceFactoryBean">
<beans:property name="resourceDetailsService" ref="resourceDetailsService" />
</beans:bean>
<!-- 项目实现的URL-授权查询服务 -->
<beans:bean id="resourceDetailsService" class="san.service.Impl.ResourceDetailsServiceImpl" />

DefinitionSourceFactoryBean中代码:

public class DefinitionSourceFactoryBean implements FactoryBean {

public Object getObject() throws Exception {
LinkedHashMap<RequestKey, ConfigAttributeDefinition> requestMap = getRequestMap();
UrlMatcher matcher = getUrlMatcher();
DefaultFilterInvocationDefinitionSource definitionSource = new DefaultFilterInvocationDefinitionSource(
matcher, requestMap);
return definitionSource;
}

private LinkedHashMap<RequestKey, ConfigAttributeDefinition> getRequestMap()
throws Exception {
LinkedHashMap<String, String> srcMap = resourceDetailsService
.getRequestMap();
LinkedHashMap<RequestKey, ConfigAttributeDefinition> requestMap = new LinkedHashMap<RequestKey,ConfigAttributeDefinition>();
ConfigAttributeEditor editor = new ConfigAttributeEditor();
for (Entry<String, String> entry : srcMap.entrySet()) {
RequestKey key = new RequestKey(entry.getKey(), null);
editor.setAsText(entry.getValue());
requestMap.put(key, (ConfigAttributeDefinition) editor.getValue());
}
return requestMap;
}
}

ResourceDetailsServiceImpl中getRequestMap()代码,对应认证中GrantedAuthority中存放的是role表中的name而言,此处resourceMap中也就应该放置资源对应的role表的name:
public LinkedHashMap<String, String> getRequestMap() throws Exception {
List<Map> roleList = userDAO.getRoleByResource("");
LinkedHashMap<String, String> resourceMap = new LinkedHashMap<String, String>();
for (Map o : roleList) {
String url = o.get("path").toString();
String role = o.get("role").toString();
if (resourceMap.containsKey(url)) {
String value = resourceMap.get(url);
resourceMap.put(url, value + "," + role);
} else {
resourceMap.put(url, role);
}
}
return resourceMap;
}

第2中授权的实现,重写FilterInvocationDefinitionSource类。
对应认证中的第二种实现(GrantedAuthority中存放的是reresource表中的name),GrantedAuthority[]变量authorities实质上是单条url资源对应的name。

public class DbFilterInvocationDefinitionSource implements
FilterInvocationDefinitionSource, InitializingBean {
……
public ConfigAttributeDefinition getAttributes(Object filter)
throws IllegalArgumentException {
GrantedAuthority[] authorities = new GrantedAuthority[0];
Resource resource = null;
Collection resources = SecurityResourceCache.getAllCache();
for (Iterator it = resources.iterator(); it.hasNext();) {
resource = (Resource) it.next();
String resPath = resource.getPath();
boolean matched = urlMatcher.pathMatchesUrl(resPath, requestURI);
if (matched) {
authorities = SecurityResourceCache.getAuthoritysInCache(resPath);
break;
}
}
if (authorities != null && authorities.length > 0) {
String authoritiesStr = " ";
for (int i = 0; i < authorities.length; i++) {
authoritiesStr += authorities[i].getAuthority() + ",";
}
String authStr = authoritiesStr.substring(0, authoritiesStr
.length() - 1);
ConfigAttributeEditor configAttrEditor = new ConfigAttributeEditor();
configAttrEditor.setAsText(authStr.trim());
return (ConfigAttributeDefinition) configAttrEditor.getValue();
}
return null;
}
}

2种授权的实现,我分别列举了ss3ex和ss3中的实现,lingo文档中的实现基本类似于ss3,综上所述,授权时有新写一个FactoryBean和重写FilterInvocationDefinitionSource类2种实现,每种实现中又分别有对应2种不同的认证,所以个共有4种实现方案,本文列举了其中2种,另2种省略。

1、那么GrantedAuthority中到底应该放什么呢?
回答:这个没有要求,只要保证认证和授权时保持一致就行了。
2、ss3ex中资源是置入缓存中的,用户访问URL时,针对每个URL与缓存中的权限进行比较,而ss3中的(资源-角色[])是系统初始化时一次性读取放入内存中,待用户访问URL时分别与内存中的比较。两者的性能方面,差不多。
3、哪种在实际工作中适用些呢?
回答:如果你的URL是以“?”带有参数的话,2者都可以使用,ss3ex中需要写个缓存。如果你的URL中的规则不是“?”带有参数的,那么只要稍微修改下ss3ex中的实现方式了,即重写FilterInvocationDefinitionSource类的实现;而ss3中的做法是调用默认的FilterInvocationDefinitionSource实现DefaultFilterInvocationDefinitionSource类的构造函数,但是FilterInvocationDefinitionSource的默认实现类中的getAttributes方法又调用类中的lookupAttributes方法的实现,在lookupAttributes方法中是写死为截掉“?”参数的,这时如果要用这个DefaultFilterInvocationDefinitionSource类的话,还要想办法重写它里面的lookupAttributes方法。
4、修改资源时,ss3ex中是必须要重新设置缓存的,而lingo对于他的实现中是重新设置下内存。
政府科技管理者如何保障科技成果评价的公正透明?.docx 政府科技管理者如何保障科技成果评价的公正透明? 立即下载

相关推荐

【Web服务器运维】基于Nginx与Keepalived的高可用负载均衡系统部署:实现故障自动切换与虚拟IP管理

内容概要:本文详细介绍了如何通过Nginx与Keepalived实现高可用的负载均衡架构。首先讲解了Nginx的安装部署流程,包括依赖环境的准备、源码解压编译、启动及配置重载;接着介绍了Keepalived的安装步骤及其服务管理方式;重点在于通过配置Keepalived的主备节点(MASTER/BACKUP),结合VRRP协议和虚拟IP(VIP)实现故障自动切换,并通过自定义脚本nginx_check.sh实时检测Nginx运行状态,确保服务高可用;最后补充了在云环境中因组播限制导致心跳不稳定时,应改用单播(unicast)方式进行通信的解决方案。; 适合人群:具备Linux系统操作基础、熟悉网络基础知识,从事运维、DevOps或Web服务部署的技术人员,尤其是工作1-3年的工程师。; 使用场景及目标:①搭建高可用的Web负载均衡系统,避免单点故障;②掌握Nginx与Keepalived协同工作的原理与实战配置方法;③应用于生产环境中提升服务稳定性与容灾能力。; 阅读建议:学习时应结合实验环境动手操作,重点关注keepalived.conf配置差异与nginx_check.sh脚本逻辑,理解VRRP机制及单播替代组播的实际应用场景,注意根据实际网络环境调整IP与网卡参数。

Spring Security2中设置Cookie的保存时间

今天改了下Ss3ex中Spring Security2的COOKIE的保存时间设置,取消了原来的两周默认值,改为用户自定义期限,粘贴相关代码如下: [code="xml"] [/code] 也许还有更好的实现,下面附上源代码,SVN中已经更新了...

三上 1653

三电平Buck直流变换器双闭环、单闭环、开环仿真【附参考文献】(Simulink仿真实现)

内容概要:本文档系统介绍了三电平Buck直流变换器在Simulink环境下的开环、单闭环与双闭环控制系统的建模仿真方法,涵盖系统建模、控制策略设计及动态性能对比分析。通过构建不同控制结构,深入探讨电压调节精度、系统响应速度、抗干扰能力及稳定性差异,重点剖析双闭环控制中电压外环与电流内环的协同作用机制,揭示其在抑制输出纹波、提升负载适应性方面的优势,帮助读者掌握多电平DC-DC变换器的核心控制原理与工程实现技术;文档还提供了详实的仿真参数设置与参考文献,便于理论验证与实践复现。; 适合人群:电力电子、自动化、电气工程及其相关专业的高校本科生、研究生、科研人员,以及从事电源系统、新能源变换器开发的工程技术人员。; 使用场景及目标:①作为高校电力电子课程的教学案例,辅助学生理解Buck变换器多层次控制策略的设计思路与性能差异;②为科研项目中高效直流变换系统的仿真研究提供可复用的技术模板;③指导工业界在高精度电源设计中优化控制器参数,提升系统动态响应与稳定性。; 阅读建议:建议结合Simulink仿真模型同步操作,对照文档逐步搭建各控制结构,重点观察不同闭环配置下输出电压的瞬态与稳态表现,深入理解PI参数整定、环路耦合影响及系统频域特性的关联性,从而全面提升对电力电子系统控制设计的综合把握能力。

实现线程内和线程间传值,合理使用ThreadLocal

以下均在ss3ex环境中 1、理解线程 [color=blue]用户请求一个URL,所触发的一系列操作,均在一个线程中。即一个servlet中执行的操作均在一个线程中。[/color] [code="java"]//actionA调用serviceA方法 actionA(){ serviceA(); } //actionB调用serviceB方法 actionB(){ ser...

三上 475

国央企创新负责人如何实现科技成果的全流程数字化管理?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

ENVI5.6 自动化流程:GF系列卫星影像批处理与质量优化

本文详细介绍了如何利用ENVI5.6构建针对GF-2、GF-6、GF-7系列卫星影像的自动化批处理流水线。通过配置Batch Processing工具,实现从正射校正到图像融合的全流程批量处理,并分享参数设置、质量监控与故障排查的实战经验,旨在显著提升海量遥感影像的处理效率与成果质量。

efc1234567的博客 603

WEB框架中异步实现方案

异步解决方案中除了JMS,AJAX,DWR等外的简单选择,就是多线程(具体的就是这个包:java.util.concurrent) 为实现在WEB中需要执行一些耗时的操作,例如发发邮件之类,但是又不能影响前台页面的响应这种需求,多线程中列举2个程序来解决。分别是立即执行和计划任务式的执行,2种执行都是在主线程外另外建个线程,故不影响主线程。 [code="java"]package Execu...

三上 411

用Cadence IC618仿真双平衡吉尔伯特混频器:从原理图到后仿的完整避坑指南

本文详细介绍了在Cadence IC618环境中设计双平衡吉尔伯特混频器的全流程,包括原理图设计、仿真优化和版图实现。通过实战案例分享,重点解析了设计中的关键技巧和常见问题解决方案,帮助工程师高效完成高性能混频器设计,特别适合射频前端开发人员参考。

weixin_42656416的博客 162

maven-eclipse-plugin 与aspectj

问题1:最近一段时间以来,项目中使用maven-eclipse-plugin的eclipse:eclipse目标时比较恼人。pom里已经加入了aspectj的依赖,但生成的.classpath里却没有相应的classpathentry。 白衣提供的解决方法是:设置ajdtVersion为none [code="xml"] org.apache.maven.plugins...

三上 380

思科模拟器CIsco Packet Tracer利用三层交换机实现VLAN间路由

版权声明:如果对大家有帮助,大家可以自行转载的。 1.技术原理: 三层交换机具备网络层的功能,实现 VLAN 相互访问的原理是:利用三层交换机的路由功能,通过识别数据包的 IP 地址,查找路由表进行选路转发,三层交换机利用直连路由可以实现不同 VLAN 之间的相互访问。三层交换机给接口配置 IP 地址。采用 SVI(交换虚拟接口)的方式实现 VLAN 间互连。SVI 是指为交换机中的VLAN 创建...

qq_37992321的博客 1万+

激光SLAM总结——Fast LIO / Fast LIO2 / Faster LIO

激光SLAM总结——Fast LIO / Fast LIO2 / Faster LIO 在之前的工作中有接触过LOAM,最近在工作中又接触到Faster LIO相关的工作,于是想着对Fast LIO / Fast LIO2 / Faster LIO这一系列工作进行一个简单的总结,以加深自己对激光SLAM算法的理解,之前总结过的一些和激光SLAM算法相关的博客还有,感兴趣的同学可以一起学习讨论: 激光SLAM总结——VLOAM / LIMO算法解析 激光SLAM总结——LIO-Mapping / LIOM /

weixin_44580210的博客 1万+

不用session、request传值的另一种解决方案

不用session、request传值的另一种解决方案: [code="java"]public class FakeSession { public static ThreadLocal messageSegment = new ThreadLocal() { public String initialValue() { return ""; ...

三上 319

使用兮克 2.5G 交换机将北京联通 EPON 改为 ODI 猫棒接入

最近入手了兮克2.5G交换机(兮克SKS1200-8GPY1XF),有 8 个 2.5G 电口和 1 个 10G SFP+ 光口;支持多种组网模式,其中一种是支持使用猫棒接入,由路由器拨号后再回接到交换机,这样就可以替换掉光猫了。

啦啦啦啦 la 1万+

解决ss3ex中mail集成bug

java1.4时发邮件是好的,由于ss3ex用的是java5的平台,集成spring2.5发邮件发不了,解决办法:先删后加 先删2个jar:geronimo-activation_1.1_spec-1.0.2.jar 和 geronimo-javamail_1.4_spec-1.3.jar 后加2个jar:activation.jar 和 mail.jar 附简单完整的代码: 1、建一...

三上 289

mstar PQ软件修改方法

1.修改ADC的值 Static code APIXC_AdcGainOffsetSetting tADCSetting[ADC_SET_NUMS]= #define INIT_ADC_RGB_RED_GAIN               0x1000 #define INIT_ADC_RGB_GREEN_GAIN           0x1000 #define INIT_ADC_RGB

qq_18810259的专栏 2565

植物GO注释

本文主要是对没有GO term库的植物进行注释。 1、选用AgriGo 进行注释,在agriGO中点击species后,查看与你目标物种相近的物种作为库 2、比如我以甜菜为例 为了找到和GO term对应的ID,先找到PLAZA,进入网站https://bioinformatics.psb.ugent.be/plaza/versions/plaza_v3_di...

weixin_30300225的博客 2225

ss3ex中的自定义URL格式

自定义URL格式,本方法只是在模仿REST样的URL格式: 比如原先的某一URL为:http://localhost:8080/article/article!listItems.shtml?article.id=297ef77923fe21850123fe24f405000f, 现在改为了:http://localhost:8080/article/article/listItems/297...

三上 279

SpringBoot + MyBatis-Plus 高效实现数据变更记录:从注解到通用审计方案(附源码)

*** 数据变更审计插件* 拦截增删改操作,自动记录变更日志*/@Component@Resource/*** 拦截SQL执行*/@Override/*** 数据变更审计插件* 拦截增删改操作,自动记录变更日志/*** 拦截SQL执行。

2601_94871597的博客 559

linux中使用broadcom型号卡上网

[color=green]确认下网卡型号: sanshang@ubuntu:~$ lspci | grep -i network 06:00.0 Network controller: Broadcom Corporation BCM4312 802.11b/g (rev 01) 1、进入http://www.broadcom.com/support/802.11/linux_sta.p...

三上 278

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

kindeditor上传图片的修改

最近做新闻系统,用了kindeditor,其中上传图片的功能没有Java版的,自己修改了下并实现它,记录下来,备忘。 我一般不是很赞同修改别人的源代码,尤其是这种开源的,否则移植性很差火,所以尽量修改最少。 1、修改../plugins/image.html文件 把form提交的地址改成action的地址。其余的不变 2、实现action,获得上传文件,并保存文件到相应目录,然后返...

三上 245

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

预先抓取,外连接,和直接查询三者直接的区别

预先抓取,外连接,和直接查询三者直接的区别: [1]. 预先抓取和外连接的字段上必须设置好映射关系。 [2]. 预先抓取和立即检索的效果一致,即直接的“from 类”语句,只不过预先抓取可以减少SQL语句的条数。 [3]. 预先抓取的关键字是join fetch,而外连接的关键字只有join。 [4]. 预先抓取将初始化代理对象的引用,把对象的数据填充完毕,即:list的时候返回的是对...

三上 244

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

ss3ex集成Beet记录日志

Beet是一个Java开源类库用于记录Spring Java应用程序的性能指示。它能够记录Java方法调用情况、SQL语句和HTTP请求,也可以记录自定义事件。配置简单,并且不需要改动任何代码。能够立即知道那一个用户与Session触发的每一个事件和什么时候触发的。提供JMX管理和诊断工具。能够将记录数据输出为XML或利用JDBC存储到数据库中。Beet对系统资源消耗低。 官方...

三上 239

tomcat6配置https

tomcat6配置双向认证 1、生成服务器端证书 [code="java"]keytool -genkey -keyalg RSA -dname "cn=localhost,ou=sango,o=none,l=china,st=beijing,c=cn" -alias server -keypass password -keystore server.jks -storepass pass...

三上 210

Struts2中页面上访问后台static类中的方法

1、在struts.xml中保证(或者设置) [code="xml"][/code] 2、页面上: [code="java"] [/code]

三上 207

Convention Plugin使用

今天突然想把ss3ex中的Codebehind Plugin换成Convention Plugin,找了些资料汇总如下: The Convention Plugin is bundled with Struts since 2.1 and replaces the Codebehind Plugin and Zero Config plugins。使用Convention插件,你需要将其JAR文...

三上 192
上一篇: WEB框架中异步实现方案
下一篇: ss3ex中的自定义URL格式
iteye_6521
博客等级 码龄8年 0粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值