2013年1月23日水曜日

Windows8 应用商店 无法连接Internet 的解决方法


Windows 8 全新的Metro 界面的开始菜单以说是Window 系统一个巨大的变革,我们可以在里面轻松的更安全下载常用的程序,浏览新闻资讯,可很多安装Windows 8 的朋友可能遇到这一问题,在打开Metro中的Windows 应用商城,资讯等应用时时,提示你的电脑没有连接到Internet,要是有应用商店,需要连接到互联网,可我们的电脑的确已经连接到网络,在桌面环境下,访问网络完全没有问题,该如何解决此类问题呢?

可能原因及解决方法,

1, 当地DNS 原因造成的,可以就进入更改适配器设置(控制面板\网络和 Internet\网络连接),选择你所使用的网络连接,右键属性,网络,TCP/IP 协议,将DNS地址更改为 8.8.8.8 或者其他DNS地址.

2, 防火墙原因, 关闭防火墙,在进行测试.

3, 网络连接原因, 控制面板\网络和 Internet\网络连接,选择以太网连接,右键属性,将internet 版本协议4 和版本协议6 之前的勾去掉,确定,后即可进入应用商城。

我也遇到了此类问题,是通过第三种方法解决的,如果你也遇到了此类问题,欢迎留言交流。


我之前应该商店是可以下东西,安东西的,只是系统自带的什么天气新闻之类的功能显示没网络,按照NO3的方法就搞定了。
我试了dns不行, 2防火墙没试,直接以太网把协议4和6的勾去了,就可以了。

2013年1月17日木曜日

免費 UML繪圖工具(繁體中文) - Software Ideas Modeler

KT來推薦一下免費且是繁體中文的UML繪圖工具



Software Ideas Modeler(SIM),

好用的程度可以到官網 softwareideas.net 下載頁面,

看到獲獎無數,也確實好用。
Photobucket

安裝Software Ideas Modeler 時,只有英文介面,

但不用擔心,安裝完畢後,會問你是要那一種國家語言介面,

此時你即可以選擇繁體中文:

Photobucket

之後選擇左邊下面的Choose Professional,即可免費使用,
其餘版本都是付費版。
Photobucket

進入程式後,即可選擇你要畫圖的類型:
Photobucket

如案例圖:
Photobucket

開始畫圖吧!!!

2013年1月16日水曜日

f.lux - 全天候默默保护眼睛健康的软件!自动调整屏幕色温减少眼睛疲劳,长时间玩电脑必备!


保护眼睛从屏幕开始—— F.lux根据时间自动调整屏幕亮度和色彩

保护眼睛从屏幕开始—— F.lux根据时间自动调整屏幕亮度和色彩
       对于平常久坐在电脑前的电脑族来说,眼睛疲劳、肩颈痛等问题可能层出不穷,长时间的屏幕照射下甚至会影响人的内分泌,让你在夜间变得难以入睡。对此问题,F.lux 开发出一套能根据时间调节屏幕亮度、色彩的小软件,安装后只要设定你的所在位置,它就会自动取得日出、日落时间,分析该时间点的光照强度,并自动为你调整屏幕。
保护眼睛从屏幕开始—— F.lux根据时间自动调整屏幕亮度和色彩

如何使用:

下载Flux后执行安装程式,与一般软件相同,安装结束后F.lux就会在右下角出现。点击任务栏上的F.lux图标,会出现设定界面,第一次使用时先点击右上角的”Change Settings”来改变时区设置。
保护眼睛从屏幕开始—— F.lux根据时间自动调整屏幕亮度和色彩

在改变时区之前我们需要给自己的位置定位。点击上图的“Change”然后点击”Locate…” 打开定位的网址,或者点此 (http://stereopsis.com/flux/map.html ) 直接进入。
保护眼睛从屏幕开始—— F.lux根据时间自动调整屏幕亮度和色彩

在打开的网页中输入你所在的位置,它就会把座标告诉你了,将它复制后粘贴在上图的设定选项界面就完成了。
保护眼睛从屏幕开始—— F.lux根据时间自动调整屏幕亮度和色彩

然后到第一步的地方设定白天、夜晚的屏幕亮度,f.lux 预设的夜晚色彩有点偏暗,你可以拖曳圆圈至适当位置。我的设定为白天 6500K、夜晚 5500K。
最后回到主画面,点击橘色的圆圈,F.lux就会让你预览白天(或夜晚)的亮度情形啦!如果你要使用电脑来做设计、绘图等方面的工作,可以将下方的”Disable for one hour”勾选,F.lux 就会休息并停止运作一小时,以免影响到你的工作。
想保护你的眼睛吗?除了适当的休息以外,使用F.lux来调整屏幕亮度也是个不错的选择,让你在晚上使用电脑时不会觉得屏幕太刺眼,白天不会觉得屏幕太暗,Yongd推荐给您使用。^o^

软件信息:

软体名称:F.lux
软体语系:英文
运行环境:Windows, Mac OS X 及 Linux
官方网站:http://www.stereopsis.com/flux/
免费下载:Windows 版本 | Mac 版本 | Linux 版本
文章部分位子来源 http://www.freegroup.org




f.lux - 全天候默默保护眼睛健康的软件!自动调整屏幕色温减少眼睛疲劳,长时间玩电脑必备!
65,810
38
在这篇文章开始之前,仔细想想,今天各位对着电脑屏幕一共几个小时了?说实话,随着个人电脑越来越普及,你是否发觉自己越来越离不开电脑了(甚至远离了电视)?电脑在带给你各种便利的时候,是否也带来了一些负面的影响甚至是伤害呢?
在生理层面上,最容易受伤的首先就是我们的眼睛。尤其在夜间对着刺眼的屏幕,长久下来必会为眼睛健康埋下隐患,同时对睡眠也会产生消极的影响。在这样的大前提下, LYcHEE 同学的第二篇评测文章为大家带来今天主角 —— f.lux 眼睛防疲劳保护软件……

f.lux 软件功能篇:

1、f.lux 是神马?他能随着一天的时间变化自动调整你电脑显示器屏幕的色温,从而尽可能减少屏幕对眼睛所带来的疲劳感并帮助提高夜猫子们的睡眠质量。“虾米!这货有这么神奇?”众人惊叹道。嗯嗯,在这一点上,软件的官网还提供了据说很专业研究报告,用数据与事实来证明 4600k 到 5000k 的暖色温确实有此功效。
f.lux 界面截图f.lux 的软件主界面截图
通过以上截图,我们不难能看出 f.lux 的设定在中午12点时是色温高潮点,午夜12点是色温低谷点。简单的说,也就是说白天冷色调,夜晚暖色调。
f.lux 软件使用效果对比使用 f.lux 的前后效果对比 (建议看后面的视频更直观)
2、因为色温的调整会令屏幕的颜色显示发生变化。开发者很贴心地专门为设计师等对颜色准确度有严格要求的高级用户提供了“暂停色温调节一小时”的功能。
3、f.lux 不仅支持 WindowsMacLinux 三大主流桌面操作系统,甚至还提供了 iOS 的版本(需要越狱,直接能在Cydia中能搜索到,使用方法与桌面版类似),可谓是面面俱到,就差 Android 了,预计不久后也会推出吧。当然,我们一般长时间主要是面对电脑屏幕的, Android 和 iOS 权当补充吧。

f.lux 使用效果视频演示

安装&系统资源占用篇

f.lux 软件本身只有5百多KB而已,安装时也无任何繁琐的选项,完成后没有桌面图标且自动运行,在系统托盘处显示。因为 F.lux 为随系统启动,所以让我们看看它的内存占用量吧~
f.lux 内存占用F.lux的内存占用量一览
如图,F.lux 的资源用量还算比较出色,作为一款静悄悄默默保护你眼睛的软件,8M的内存占用怎么看。。。都是值了。。对吧?

软件使用篇

软件界面启动后,我们先点击右上角的“change settings” 按钮来到设置选项卡。
f.lux 设置
#1用来调节白天和晚上的屏幕亮度,大家可以自行感受一下不多赘述了(可能大家会觉得 软件调出来的颜色很黄(但不暴力),不过由于屏幕颜色是随着当地时间的变化而循环渐变的,实际笔者1年实际使用感觉过渡很自然不突兀。)
#2是设置当前的地理位置(f.lux 以此来推算出当地现在时间的),是整个软件能否正常工作的关键哦~
#3是设置屏幕渐变的速度,分为“快(20s)”和“慢(1小时)”,推荐使用Vista及以上系统的朋友选择慢速渐变,效果非常自然平滑。但是根据一些用户的使用反馈,XP下慢速选项是有BUG的只能退而选快速变换(笔者周围没有XP的系统了,故没法测试。)
全部设置完后,点击界面右上角的“Done”保存设置。现在在软件主界面上 你可以双击曲线图来预览24小时色温变化~还是挺有趣挺贴心的功能哦?

知识普及:色温 (摘自整理于百度百科)

色温是表示光源光谱质量最通用的指标。一般用Tc表示。色温是按绝对黑体来定义的,光源的辐射在可见区和绝对黑体的辐射完全相同时,此时黑体的温度就称此光源的色温。
高色温光源照射下,如亮度不高则给人们有一种阴冷的气氛;低色温光源照射下,亮度过高会给人们有一种闷热感觉。光色的对比:在同一空间使用两种光色差很大的光源,其对比将会出现层次效果,光色对比大时,在获得亮度层次的同时,又可获得光色的层次。
色温笔记本默认色温是 5600K,现在这样想想到了晚上,会不会太刺眼了点~

题外话

对于每天必须面对着屏幕的广大苦逼 IT 人士,或是不玩电脑会死星人们来说,相信没有什么比这款软件更值得下载的了!笔者强烈地认为,f.lux 开发的初衷并不是想要延长各位使用电脑的时间,而是在不得不面对电脑的时间内尽量减少屏幕对眼睛的伤害,每天仍然要控制好盯着电脑的时间。况且,没有什么比每2,3个小时休息一下眼睛或者和亲人朋友去外面看看绿色散散步更好的保护方法了~
此外,f.lux 是完全免费的软件,并且不设捐助,这是非常难能可贵的。从官网上我们还能感受到软件作者对于投身慈善事业的热情,近期在做世界地区贫困地区水资源清洁的工作,感兴趣愿意献爱心的朋友们可以移步去看看……自此,F.lux 的评测推荐到此为止,期待 LYcHEE 在异次元的下一次的作品吧~

相关文件下载地址:

官方网站:访问
软件性质:免费

保护眼睛的三款软件(电脑工作者必备)


电脑虽然可以帮助我们干很多活儿,可它也不是完全无害的忠实朋友,就像早期质量低劣的彩色电视机“培养”了一批近视患者一样(尽管有研究表明近视是基因遗传问题,但外部环境的刺激无疑是起质变作用的关键诱因。),电脑使用不当带来的眼睛卫生问题也不容小觑,甚至已经成为一种最普遍的现代职业病。电脑一族由于长时间以单一坐姿接触电脑,如果不注意休息调节,除了颈椎、身材、肌肉受到负面影响外,眼睛更是首当其冲,飞蚊症就是常见的一种眼科疾病,让人失望的是目前的医学技术对飞蚊症几乎无能为力,只能靠保养、呵护来控制改善。眼睛的宝贵就毋庸赘言了,下面介绍三款有益于保护眼睛的小软件,三者功能接近,但各有特色,希望可以给大家带来帮助,也欢迎转载。视力保护软件固然是一种手段,但健康的理念和执行力无疑是最最重要的。
保护眼睛的三款软件(电脑工作者必备)

一、眼睛卫士
这是我最早使用的视力保护类软件,主要功能如下:
1.设置定时休息,休息锁定屏幕,屏幕上出现文字:“您持续工作的时间太长了,请您,站起来……”,你也可以自己设置文字,同时还可以设置锁屏时的播放的音乐。
2.设置定时关机。
3.整点/半小时报时,游戏、全屏时暂停计时,这样子就不会影响你打游戏了。
4.智能跟踪。这个功能是自动判断你鼠标和键盘有没有动作,如果没有动作超过了五分钟,就认为你是在休息,此时将重新开始计时。
5.上网计时。这个功能还包括强制记忆持续工作计时,也就是说如果你重启了也不影响计时的连续。
此外,你还可以决定是否随系统自动运行、是否最小化到托盘、是否防止系统进程被杀等,还可以随时点击右键在快捷菜单里让眼睛卫士失效或者休息。
总体来说,这个小软件功能十分强大,很适合长时间在电脑前坐的朋友。更重要的是它绿色,仅有28K,内存占有仅600K,这种迷你又强大的软件实在很少见了。
2、eyedefender
跟眼睛卫士非常相似的一款佳软,体积小巧,功能完备,休息时的屏保比较好玩儿,跟它的名字一样,绝对的眼睛保护者。
小众软件的介绍:http://www.appinn.com/eyedefender/
3、workrave
这个软件比前两者的体积要大,因而功能也多,比如眼睛保健操的动画导引非常有趣实用。但这个软件强制力不是很高,允许你忽略锁屏,自制力较好的人可以使用,反之恐怕就没有多少效果了。
小众软件的介绍:http://www.appinn.com/workrave/
如果你知道同类的或者更好的眼睛保护软件,可以留言推荐。眼睛是心灵的窗户,拥有一双会说话的眼睛,顾盼生辉,明眸流波,就从小处做起吧,别忘了坚持坚持再坚持,内化成为习惯,健康美丽也就随之而来了。

2013年1月15日火曜日

spring security 3 中使用自定义数据库来设置权限


在spring security3中使用自己定义的数据结构来实现权限设置。
  1. 数据库
    • 用户表
    • 角色表
    • action表,即资源表
    • 角色-用户关联表
    • actiion-角色关联表
  2. 配置过程
    • web.xml中加入过滤器
      [xhtml:nogutter] view plaincopy
      1. <!-- 配置spiring security -->  
      2.     <filter>  
      3.         <filter-name>springSecurityFilterChain</filter-name>  
      4.         <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>  
      5.     </filter>  
      6.     <filter-mapping>  
      7.         <filter-name>springSecurityFilterChain</filter-name>  
      8.         <url-pattern>/*</url-pattern>  
      9.     </filter-mapping>  
      10. <!-- 配置spiring security结束 -->  
       
    • 在applicationContext.xml中import spring security部分的配置
      [c-sharp] view plaincopy
      1. <import resource="security3.0_JPA.xml"/>   
    • 配置import resource="security3.0_JPA.xml
      [c-sharp:nogutter] view plaincopy
      1. <?xml version="1.0" encoding="UTF-8"?>  
      2. <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  
      3.            http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
      4.            http://www.springframework.org/schema/security  
      5.            http://www.springframework.org/schema/security/spring-security-3.0.xsd">  
      6.     <http auto-config="true" access-denied-page="/jsp/accessDenied.jsp">  
      7.         <intercept-url pattern="/css/**" filters="none" />  
      8.         <intercept-url pattern="/images/**" filters="none" />  
      9.         <intercept-url pattern="/js/**" filters="none" />  
      10.         <!-- 增加一个filter,这点与Acegi是不一样的,不能修改默认的filter了,  
      11.         这个filter位于FILTER_SECURITY_INTERCEPTOR之前  -->  
      12.         <custom-filter ref="myFilter" before="FILTER_SECURITY_INTERCEPTOR" />  
      13.     </http>  
      14.     <!-- 一个自定义的filter,必须包含authenticationManager,accessDecisionManager,securityMetadataSource三个属性,  
      15.         我们的所有控制将在这三个类中实现,解释详见具体配置  -->  
      16.     <beans:bean id="myFilter" class="com.softvan.spring.security.FilterSecurityInterceptor">  
      17.         <beans:property name="authenticationManager" ref="MyAuthenticationManager" />  
      18.         <!-- 访问决策器,决定某个用户具有的角色,是否有足够的权限去访问某个资源     -->  
      19.         <beans:property name="accessDecisionManager" ref="AccessDecisionManager" />  
      20.         <beans:property name="securityMetadataSource" ref="MySecurityMetadataSource" />  
      21.     </beans:bean>  
      22.     <!-- 资源源数据定义,将所有的资源和权限对应关系建立起来,即定义某一资源可以被哪些角色访问     -->  
      23.     <beans:bean id="MySecurityMetadataSource" init-method="loadResourceDefine"  class="com.softvan.spring.security.InvocationSecurityMetadataSourceService">  
      24.         <beans:property name="roleService" ref="RoleService" />  
      25.         <beans:property name="actionService" ref="ActionService" />  
      26.     </beans:bean>  
      27.   
      28.     <!-- 验证配置 , 认证管理器,实现用户认证的入口,主要实现UserDetailsService接口即可 -->  
      29.     <authentication-manager alias="MyAuthenticationManager">  
      30.         <authentication-provider user-service-ref="UserDetailService">  
      31.             <!--  
      32.             <s:password-encoder hash="sha" />  
      33.              -->  
      34.         </authentication-provider>  
      35.     </authentication-manager>  
      36. </beans:beans>   
  3. 相关java代码
    • AccessDecisionManager.java
      [java:nogutter] view plaincopy
      1. /** 
      2.  *  
      3.  */  
      4. package com.softvan.spring.security;  
      5. import org.apache.log4j.Logger;  
      6. /** 
      7.  * @author 徐泽宇(roamer) 
      8.  * 
      9.  * 2010-7-4 
      10.  */  
      11. import java.util.Collection;  
      12. import java.util.Iterator;  
      13. import org.springframework.security.access.AccessDeniedException;  
      14. import org.springframework.security.access.ConfigAttribute;  
      15. import org.springframework.security.access.SecurityConfig;  
      16. import org.springframework.security.authentication.InsufficientAuthenticationException;  
      17. import org.springframework.security.core.Authentication;  
      18. import org.springframework.security.core.GrantedAuthority;  
      19. import org.springframework.stereotype.Service;  
      20. @Service("AccessDecisionManager")  
      21. public class AccessDecisionManager implements org.springframework.security.access.AccessDecisionManager {  
      22.     /** 
      23.      * Logger for this class 
      24.      */  
      25.     private static final Logger logger = Logger.getLogger(AccessDecisionManager.class);  
      26.     // In this method, need to compare authentication with configAttributes.  
      27.     // 1, A object is a URL, a filter was find permission configuration by this  
      28.     // URL, and pass to here.  
      29.     // 2, Check authentication has attribute in permission configuration  
      30.     // (configAttributes)  
      31.     // 3, If not match corresponding authentication, throw a  
      32.     // AccessDeniedException.  
      33.     public void decide(Authentication authentication, Object object, Collection<ConfigAttribute> configAttributes) throws AccessDeniedException, InsufficientAuthenticationException {  
      34.         if (logger.isDebugEnabled()) {  
      35.             logger.debug("decide(Authentication, Object, Collection<ConfigAttribute>) - start"); //$NON-NLS-1$  
      36.         }  
      37.         if (configAttributes == null) {  
      38.             if (logger.isDebugEnabled()) {  
      39.                 logger.debug("decide(Authentication, Object, Collection<ConfigAttribute>) - end"); //$NON-NLS-1$  
      40.             }  
      41.             return;  
      42.         }  
      43.         if (logger.isDebugEnabled()){  
      44.             logger.debug("正在访问的url是:"+object.toString());  
      45.         }  
      46.         Iterator<ConfigAttribute> ite = configAttributes.iterator();  
      47.         while (ite.hasNext()) {  
      48.             ConfigAttribute ca = ite.next();  
      49.             logger.debug("needRole is:"+ca.getAttribute());  
      50.             String needRole = ((SecurityConfig) ca).getAttribute();  
      51.             for (GrantedAuthority ga : authentication.getAuthorities()) {  
      52.                 logger.debug("/t授权信息是:"+ga.getAuthority());  
      53.                 if (needRole.equals(ga.getAuthority())) { // ga is user's role.  
      54.                     if (logger.isDebugEnabled()) {  
      55.                         logger.debug("判断到,needRole 是"+needRole+",用户的角色是:"+ga.getAuthority()+",授权数据相匹配");  
      56.                         logger.debug("decide(Authentication, Object, Collection<ConfigAttribute>) - end"); //$NON-NLS-1$  
      57.                     }  
      58.                     return;  
      59.                 }  
      60.             }  
      61.         }  
      62.         throw new AccessDeniedException("没有权限");  
      63.     }  
      64.     public boolean supports(ConfigAttribute attribute) {  
      65.         // TODO Auto-generated method stub  
      66.         return true;  
      67.     }  
      68.     public boolean supports(Class<?> clazz) {  
      69.         return true;  
      70.     }  
      71. }   
    • FilterSecurityInterceptor.java
      [java:nogutter] view plaincopy
      1. /** 
      2.  *  
      3.  */  
      4. package com.softvan.spring.security;  
      5. import org.apache.log4j.Logger;  
      6. /** 
      7.  * @author 徐泽宇(roamer) 
      8.  * 
      9.  * 2010-7-4 
      10.  */  
      11. import java.io.IOException;  
      12. import javax.servlet.Filter;  
      13. import javax.servlet.FilterChain;  
      14. import javax.servlet.FilterConfig;  
      15. import javax.servlet.ServletException;  
      16. import javax.servlet.ServletRequest;  
      17. import javax.servlet.ServletResponse;  
      18. import org.springframework.security.access.SecurityMetadataSource;  
      19. import org.springframework.security.access.intercept.AbstractSecurityInterceptor;  
      20. import org.springframework.security.access.intercept.InterceptorStatusToken;  
      21. import org.springframework.security.web.FilterInvocation;  
      22. import org.springframework.security.web.access.intercept.FilterInvocationSecurityMetadataSource;  
      23. public class FilterSecurityInterceptor extends AbstractSecurityInterceptor implements Filter {  
      24.     /** 
      25.      * Logger for this class 
      26.      */  
      27.     private static final Logger logger = Logger.getLogger(FilterSecurityInterceptor.class);  
      28.     private FilterInvocationSecurityMetadataSource securityMetadataSource;  
      29.     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {  
      30.         if (logger.isDebugEnabled()) {  
      31.             logger.debug("doFilter(ServletRequest, ServletResponse, FilterChain) - start"); //$NON-NLS-1$  
      32.         }  
      33.         FilterInvocation fi = new FilterInvocation(request, response, chain);  
      34.         invoke(fi);  
      35.         if (logger.isDebugEnabled()) {  
      36.             logger.debug("doFilter(ServletRequest, ServletResponse, FilterChain) - end"); //$NON-NLS-1$  
      37.         }  
      38.     }  
      39.     public FilterInvocationSecurityMetadataSource getSecurityMetadataSource() {  
      40.         return this.securityMetadataSource;  
      41.     }  
      42.     public Class<? extends Object> getSecureObjectClass() {  
      43.         return FilterInvocation.class;  
      44.     }  
      45.     public void invoke(FilterInvocation fi) throws IOException, ServletException {  
      46.         InterceptorStatusToken token = super.beforeInvocation(fi);  
      47.         try {  
      48.             fi.getChain().doFilter(fi.getRequest(), fi.getResponse());  
      49.         } finally {  
      50.             super.afterInvocation(token, null);  
      51.         }  
      52.     }  
      53.     @Override  
      54.     public SecurityMetadataSource obtainSecurityMetadataSource() {  
      55.         return this.securityMetadataSource;  
      56.     }  
      57.     public void setSecurityMetadataSource(FilterInvocationSecurityMetadataSource securityMetadataSource) {  
      58.         this.securityMetadataSource = securityMetadataSource;  
      59.     }  
      60.     public void destroy() {  
      61.         // TODO Auto-generated method stub  
      62.     }  
      63.     public void init(FilterConfig filterconfig) throws ServletException {  
      64.         // TODO Auto-generated method stub  
      65.     }  
      66. }   
    • InvocationSecurityMetadataSourceService.java
      [java:nogutter] view plaincopy
      1. /** 
      2.  *  
      3.  */  
      4. package com.softvan.spring.security;  
      5. import java.util.ArrayList;  
      6. import java.util.Collection;  
      7. import java.util.HashMap;  
      8. import java.util.Iterator;  
      9. import java.util.List;  
      10. import java.util.Map;  
      11. import org.apache.log4j.Logger;  
      12. import org.springframework.security.access.ConfigAttribute;  
      13. import org.springframework.security.access.SecurityConfig;  
      14. import org.springframework.security.web.FilterInvocation;  
      15. import org.springframework.security.web.access.intercept.FilterInvocationSecurityMetadataSource;  
      16. import org.springframework.security.web.util.AntUrlPathMatcher;  
      17. import org.springframework.security.web.util.UrlMatcher;  
      18. import org.springframework.stereotype.Service;  
      19. import com.alcor.acl.domain.TAction;  
      20. import com.alcor.acl.domain.TRole;  
      21. import com.alcor.acl.service.ActionService;  
      22. import com.alcor.acl.service.RoleService;  
      23. /* 
      24.  *  
      25.  * 最核心的地方,就是提供某个资源对应的权限定义,即getAttributes方法返回的结果。 
      26.  * 注意,我例子中使用的是AntUrlPathMatcher这个path matcher来检查URL是否与资源定义匹配, 
      27.  * 事实上你还要用正则的方式来匹配,或者自己实现一个matcher。 
      28.  *  
      29.  * 此类在初始化时,应该取到所有资源及其对应角色的定义 
      30.  *  
      31.  * 说明:对于方法的spring注入,只能在方法和成员变量里注入, 
      32.  * 如果一个类要进行实例化的时候,不能注入对象和操作对象, 
      33.  * 所以在构造函数里不能进行操作注入的数据。 
      34.  */  
      35. @Service("InvocationSecurityMetadataSourceService")  
      36. public class InvocationSecurityMetadataSourceService implements FilterInvocationSecurityMetadataSource {  
      37.     /** 
      38.      * Logger for this class 
      39.      */  
      40.     private static final Logger logger = Logger.getLogger(InvocationSecurityMetadataSourceService.class);  
      41.       
      42.     private RoleService roleService ;  
      43.     private ActionService actionService;   
      44.       
      45.     private UrlMatcher urlMatcher = new AntUrlPathMatcher();  
      46.     private static Map<String, Collection<ConfigAttribute>> resourceMap = null;  
      47.     public  void loadResourceDefine()throws Exception  {  
      48.         this.resourceMap = new HashMap<String, Collection<ConfigAttribute>>();  
      49.           
      50.         //通过数据库中的信息设置,resouce和role  
      51.         for (TRole item:this.roleService.getAllRoles()){  
      52.             Collection<ConfigAttribute> atts = new ArrayList<ConfigAttribute>();  
      53.             ConfigAttribute ca = new SecurityConfig(item.getRoleName());  
      54.             atts.add(ca);  
      55.             List<TAction> tActionList = actionService.findByRoleID(item.getRoleId());  
      56.             //把资源放入到spring security的resouceMap中  
      57.             for(TAction tAction:tActionList){  
      58.                 logger.debug("获得角色:["+item.getRoleName()+"]拥有的acton有:"+tAction.getActionUrl());  
      59.                 this.resourceMap.put(tAction.getActionUrl(), atts);  
      60.             }  
      61.         }  
      62.           
      63.         /*//通过硬编码设置,resouce和role 
      64.         resourceMap = new HashMap<String, Collection<ConfigAttribute>>(); 
      65.         Collection<ConfigAttribute> atts = new ArrayList<ConfigAttribute>(); 
      66.         ConfigAttribute ca = new SecurityConfig("admin");  
      67.         atts.add(ca);  
      68.         resourceMap.put("/jsp/admin.jsp", atts);  
      69.         resourceMap.put("/swf/zara.html", atts);*/   
      70.           
      71.     }  
      72.     // According to a URL, Find out permission configuration of this URL.  
      73.     public Collection<ConfigAttribute> getAttributes(Object object) throws IllegalArgumentException {  
      74.         if (logger.isDebugEnabled()) {  
      75.             logger.debug("getAttributes(Object) - start"); //$NON-NLS-1$  
      76.         }  
      77.         // guess object is a URL.  
      78.         String url = ((FilterInvocation) object).getRequestUrl();  
      79.         Iterator<String> ite = resourceMap.keySet().iterator();  
      80.         while (ite.hasNext()) {  
      81.             String resURL = ite.next();  
      82.             if (urlMatcher.pathMatchesUrl(url, resURL)) {  
      83.                 Collection<ConfigAttribute> returnCollection = resourceMap.get(resURL);  
      84.                 if (logger.isDebugEnabled()) {  
      85.                     logger.debug("getAttributes(Object) - end"); //$NON-NLS-1$  
      86.                 }  
      87.                 return returnCollection;  
      88.             }  
      89.         }  
      90.         if (logger.isDebugEnabled()) {  
      91.             logger.debug("getAttributes(Object) - end"); //$NON-NLS-1$  
      92.         }  
      93.         return null;  
      94.     }  
      95.     public boolean supports(Class<?> clazz) {  
      96.         return true;  
      97.     }  
      98.     public Collection<ConfigAttribute> getAllConfigAttributes() {  
      99.         return null;  
      100.     }  
      101.     public RoleService getRoleService() {  
      102.         return roleService;  
      103.     }  
      104.     public void setRoleService(RoleService roleService) {  
      105.         this.roleService = roleService;  
      106.     }  
      107.     public ActionService getActionService() {  
      108.         return actionService;  
      109.     }  
      110.     public void setActionService(ActionService actionService) {  
      111.         this.actionService = actionService;  
      112.     }  
      113. }   
    • UserDetailService.java
      [java:nogutter] view plaincopy
      1. /** 
      2.  *  
      3.  */  
      4. package com.softvan.spring.security;  
      5. import java.util.ArrayList;  
      6. import java.util.Collection;  
      7. import java.util.Set;  
      8. import javax.inject.Inject;  
      9. import org.apache.log4j.Logger;  
      10. import org.springframework.dao.DataAccessException;  
      11. import org.springframework.security.core.GrantedAuthority;  
      12. import org.springframework.security.core.authority.GrantedAuthorityImpl;  
      13. import org.springframework.security.core.userdetails.User;  
      14. import org.springframework.security.core.userdetails.UserDetails;  
      15. import org.springframework.security.core.userdetails.UserDetailsService;  
      16. import org.springframework.security.core.userdetails.UsernameNotFoundException;  
      17. import org.springframework.stereotype.Service;  
      18. import com.alcor.acl.domain.TRole;  
      19. import com.alcor.acl.domain.TUser;  
      20. @Service("UserDetailService")  
      21. public class UserDetailService implements UserDetailsService  {  
      22.     /** 
      23.      * Logger for this class 
      24.      */  
      25.     private static final Logger logger = Logger.getLogger(UserDetailService.class);  
      26.     @Inject  
      27.     com.alcor.acl.component.User user ;   
      28.           
      29.     public UserDetails loadUserByUsername(String username)throws UsernameNotFoundException, DataAccessException {  
      30.         if (logger.isDebugEnabled()) {  
      31.             logger.debug("loadUserByUsername(String) - start"); //$NON-NLS-1$  
      32.         }  
      33.               
      34.             Collection<GrantedAuthority> auths=new ArrayList<GrantedAuthority>();  
      35.               
      36.             String password=null;  
      37.             //取得用户的密码  
      38.             TUser tUser = user.getUserByName(username);  
      39.             if (tUser ==null){  
      40.                 String message = "用户"+username+"不存在";  
      41.                 logger.error(message);  
      42.                 throw new UsernameNotFoundException(message);  
      43.             }  
      44.             password=user.getUserByName(username).getPassword();  
      45.               
      46.             //获得用户的角色  
      47.             Set<TRole> tRoles =tUser.getTRoles();  
      48.             for(TRole item : tRoles){  
      49.                 GrantedAuthorityImpl grantedAuthorityImpl = new GrantedAuthorityImpl(item.getRoleName());  
      50.                 if (logger.isDebugEnabled()){  
      51.                     logger.debug("用户:["+tUser.getName()+"]拥有角色:["+item.getRoleName()+"],即spring security中的access");  
      52.                 }  
      53.                 auths.add(grantedAuthorityImpl);  
      54.             }  
      55.               
      56.             User user = new User(username,password, truetruetruetrue, auths);  
      57.               
      58.         if (logger.isDebugEnabled()) {  
      59.             logger.debug("loadUserByUsername(String) - end"); //$NON-NLS-1$  
      60.         }  
      61.             return user;  
      62.     }  
      63. }