- 浏览: 37699 次
- 性别:
- 来自: 佛山
最新评论
-
zwljava:
不错,整合java和air比较方便的办法。
Flex AIR(WindowedApplication)与Java的socket通讯例子。 -
momoko8443:
对于两个结构一致的object 判断其内容是否一致用什么断言? ...
小试FlexUnit(Flex单元测试) -
liuyxit:
@rickwang
主要是校验业务方法的正确性,这跟其它开发语 ...
小试FlexUnit(Flex单元测试) -
bubusy:
如果我想测试跟ui界面相关的部分,并且还有跟后台的交互,用这个 ...
小试FlexUnit(Flex单元测试) -
rickwang:
其实以前做的项目比较小,一直闭门造车般的做了一年多的Flex, ...
小试FlexUnit(Flex单元测试)
最近两星期在学习acegi,过程中感谢JavaEye,SpringSide和在网上提供acegi学习心得的网友们。
为了加深自己的认识,准备写下一些DEMO,希望可以给准备学习acegi的同学一些帮助。
作为安全服务离不开认证和授权这两个主要组成部分。而这篇文章就是针对acegi的认证服务。
《学习Acegi-认证(authentication)》
代码环境基于:
JDK1.5
acegi1.0.3
spring2.0
IDE基于:
Eclipse3.2+MyEclipse5.0.1
面向人员:
熟悉Eclipse+MyEclipse开发但刚开始了解acegi的人员。如果你是高手请指出文章不足之处。
1.建立一个MyEclipse的WebProject,把下列jar文件拷贝到项目的WEB-INF/lib目录:
acegi-security-1.0.3.jar
spring2.0.jar
commons-codec-1.3.jar
费话说一句(占些字数):这是因为代码运行需要这些包的支持。
2.修改WEB-INF下的web.xml文件,内容如下:
其中FilterChainProxy实现了filter接口,它主要是实例化FilterChainProxy,并把所有动作交由FilterChainProxy处理。这样简化了web.xml的配置,并且充分利用了Spring IOC管理Bean的优势。
3.在src目录右键新建一个resource folder,在下面再建立acegi和spring目录
在spring目录中创建applicationContext.xml文件,内容:
[list=A]其中filterChainProxy就是由web.xml声明的filter(FilterToBeanProxy)的targetClass。它主要是装载filterInvocationDefinitionSource指定的filter类(例子中为authenticationProcessingFilter,exceptionTranslationFilter),并顺序调用它们的doFilter方法,进行安全服务处理。[/list]
[list=B]而authenticationProcessingFilter是处理一个认证表单,登陆用的表单必须提交用户名和密码这两个参数给这个filter.由用户名和密码构造一个UsernamePasswordAuthenticationToken,将传给AuthenticationManager的authenticate方法进行认证处理。该filter默认处理filterProcessesUrl属性指定的URL,认证失败会转到authenticationFailureUrl,认证成功会转到defaultTargetUrl页面。[/list]
[list=C]AuthenticationManager顾名思义认证管理器,它只有一个接口方法authenticate用于返回认证结果,他的实现类由多个AuthenticationProvider进行投票,决定认证是否通过。[/list]
[list=D]daoAuthenticationProvider是检验用户录入的认证数据是否正确(说白了就是用户名和密码是否正确)[/list]
[list=E]inMemoryDaoImpl是给daoAuthenticationProvider提供系统的用户资料。而资料的来源是从配置中装载到内存的。[/list]
[list=F]当认证不通过时,AuthenticationManager的实现类AbstractAuthenticationManager会抛出AuthenticationException类型的异常。这时排在最后的exceptionTranslationFilter会捕获该异常,并转向authenticationEntryPoint。[/list]
4.在WebRoot下创建index.jsp(其实不要也没关系,主要是为了方便),直接转向用户资料显示页。内容如下:
5.在WebRoot下创建userinfo.jsp,用于显示当前登陆的用户信息。内容如下
6.在WebRoot下创建acegilogin.jsp
7.OK,发布项目,访问http://localhost:8080/acegiexample
这时index.jsp会自动转向userinfo.jsp,由于还没有用户登录,所以没有资料显示。按登陆链接进入登录页,登录成功后会看到显示用户名的页面(当然可以有更多的用户资料,但这仅仅是example),不成功时会在登录页提示信息。我们可以用user1和user2登陆,可以分别测试登录成功和失败的流程。
8.可以看到登录页上有自动登陆功能,而userinfo.jsp页有注销功能。但还是不起作用,好,现在我们马上首手加入这两个功能。看acegi可以方便到什么程度。修改applicationContext.xml如下:
另要注意:Acegi默认的自动登陆设定参数名为_acegi_security_remember_me,注销链接为/j_acegi_logout。
马上重启Tomcat测试看看^_^。
9.通常用户资料会放在数据库中,而不会放在配置文件,接着下面我们来再行修改一下。
首先创建要用到的用户表和权限表,并插入初始化数据:
这里我用的是acegi默认的数据结构,可以改只要你指定JdbcDaoImpl的authoritiesByUsernameQuery和usersByUsernameQuery属性就可以了。另AUTHORITIES表也要一同加入,原因acegi获得userDetail时,也会读取这个表的内容,否则会抛“nested exception is java.sql.SQLException: 对象名 'authorities' 无效”这个异常。
修改applicationContext.xml,变成如下:
OK,大功告成。
后记:很少写技术文章,除了要坚持之外,文笔和思路都很重要。感觉自己的写作水平太差了,希望大家指出不合理的地方。有时间我会再写后篇《学习Acegi-授权(authorization)》,感谢大家把拙文看完,TKS!
应该是对的吧.
i study from this.thanks you~
please go ahead!!!
是阿,打个包更方便看了,已经收藏了,好文章
为了加深自己的认识,准备写下一些DEMO,希望可以给准备学习acegi的同学一些帮助。
作为安全服务离不开认证和授权这两个主要组成部分。而这篇文章就是针对acegi的认证服务。
《学习Acegi-认证(authentication)》
代码环境基于:
JDK1.5
acegi1.0.3
spring2.0
IDE基于:
Eclipse3.2+MyEclipse5.0.1
面向人员:
熟悉Eclipse+MyEclipse开发但刚开始了解acegi的人员。如果你是高手请指出文章不足之处。
1.建立一个MyEclipse的WebProject,把下列jar文件拷贝到项目的WEB-INF/lib目录:
acegi-security-1.0.3.jar
spring2.0.jar
commons-codec-1.3.jar
费话说一句(占些字数):这是因为代码运行需要这些包的支持。
2.修改WEB-INF下的web.xml文件,内容如下:
<?xml version="1.0" encoding="UTF-8"?> <web-app> <display-name>acegi Example of liuyxit</display-name> <!-- 定义应用的上下文参数,用于ContextLoaderListener --> <context-param> <param-name>contextConfigLocation</param-name> <param-value> classpath:spring/applicationContext.xml </param-value> </context-param> <!--acegi 的filter链代理--> <filter> <filter-name>Acegi Filter Chain Proxy</filter-name> <filter-class> org.acegisecurity.util.FilterToBeanProxy </filter-class> <init-param> <param-name>targetClass</param-name> <param-value> org.acegisecurity.util.FilterChainProxy </param-value> </init-param> </filter> <filter-mapping> <filter-name>Acegi Filter Chain Proxy</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 装载应用软件的Spring上下文 要由WebapplicationContextUtils.getWebApplicationnContext(servletContext)得到. --> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> </web-app>
其中FilterChainProxy实现了filter接口,它主要是实例化FilterChainProxy,并把所有动作交由FilterChainProxy处理。这样简化了web.xml的配置,并且充分利用了Spring IOC管理Bean的优势。
3.在src目录右键新建一个resource folder,在下面再建立acegi和spring目录
在spring目录中创建applicationContext.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:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd" default-autowire="byName" default-lazy-init="true"> <!-- ======================== FILTER CHAIN ======================= --> <bean id="filterChainProxy" class="org.acegisecurity.util.FilterChainProxy"> <property name="filterInvocationDefinitionSource"> <value> CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON PATTERN_TYPE_APACHE_ANT /**=authenticationProcessingFilter,exceptionTranslationFilter </value> </property> </bean> <!-- ======================== 认证filter ======================= --> <!-- 表单认证处理filter --> <bean id="authenticationProcessingFilter" class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilter"> <property name="authenticationManager" ref="authenticationManager"/> <property name="authenticationFailureUrl" value="/acegilogin.jsp?login_error=1"/> <property name="defaultTargetUrl" value="/userinfo.jsp"/> <property name="filterProcessesUrl" value="/j_acegi_security_check"/> </bean> <!-- 认证管理器 --> <bean id="authenticationManager" class="org.acegisecurity.providers.ProviderManager"> <property name="providers"><!-- 可有多个认证提供器,其中一个证通过就可以了 --> <list> <ref local="daoAuthenticationProvider"/> </list> </property> </bean> <bean id="daoAuthenticationProvider" class="org.acegisecurity.providers.dao.DaoAuthenticationProvider"> <property name="userDetailsService" ref="inMemoryDaoImpl"/> </bean> <!-- 用户资料--> <bean id="inMemoryDaoImpl" class="org.acegisecurity.userdetails.memory.InMemoryDaoImpl"> <property name="userMap"> <value> liuyxit=123,ROLE_SUPERVISOR user1=user1,ROLE_USER user2=user2,disabled,ROLE_USER </value> </property> </bean> <!-- 异常处理filter --> <bean id="exceptionTranslationFilter" class="org.acegisecurity.ui.ExceptionTranslationFilter"> <property name="authenticationEntryPoint"> <bean class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint"> <property name="loginFormUrl" value="/acegilogin.jsp"/> <property name="forceHttps" value="false"/> </bean> </property> <property name="accessDeniedHandler"> <bean class="org.acegisecurity.ui.AccessDeniedHandlerImpl"> <property name="errorPage" value="/accessDenied.jsp"/> </bean> </property> </bean> </beans>
[list=A]其中filterChainProxy就是由web.xml声明的filter(FilterToBeanProxy)的targetClass。它主要是装载filterInvocationDefinitionSource指定的filter类(例子中为authenticationProcessingFilter,exceptionTranslationFilter),并顺序调用它们的doFilter方法,进行安全服务处理。[/list]
[list=B]而authenticationProcessingFilter是处理一个认证表单,登陆用的表单必须提交用户名和密码这两个参数给这个filter.由用户名和密码构造一个UsernamePasswordAuthenticationToken,将传给AuthenticationManager的authenticate方法进行认证处理。该filter默认处理filterProcessesUrl属性指定的URL,认证失败会转到authenticationFailureUrl,认证成功会转到defaultTargetUrl页面。[/list]
[list=C]AuthenticationManager顾名思义认证管理器,它只有一个接口方法authenticate用于返回认证结果,他的实现类由多个AuthenticationProvider进行投票,决定认证是否通过。[/list]
[list=D]daoAuthenticationProvider是检验用户录入的认证数据是否正确(说白了就是用户名和密码是否正确)[/list]
[list=E]inMemoryDaoImpl是给daoAuthenticationProvider提供系统的用户资料。而资料的来源是从配置中装载到内存的。[/list]
[list=F]当认证不通过时,AuthenticationManager的实现类AbstractAuthenticationManager会抛出AuthenticationException类型的异常。这时排在最后的exceptionTranslationFilter会捕获该异常,并转向authenticationEntryPoint。[/list]
4.在WebRoot下创建index.jsp(其实不要也没关系,主要是为了方便),直接转向用户资料显示页。内容如下:
<%@ page language="java" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <META HTTP-EQUIV="Refresh" CONTENT="0;URL=userinfo.jsp"> </head> <body> <p>Loading ...</p> </body> </html>
5.在WebRoot下创建userinfo.jsp,用于显示当前登陆的用户信息。内容如下
<%@ page language="java" pageEncoding="UTF-8"%> <%@ page import="org.acegisecurity.context.SecurityContextHolder"%> <%@ page import="org.acegisecurity.userdetails.*"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>My JSP 'pass.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> </head> <body> 当前用户: <% Object obj = SecurityContextHolder.getContext().getAuthentication(); if (null != obj){ Object userDetail = SecurityContextHolder.getContext().getAuthentication().getPrincipal(); String username = ""; if (userDetail instanceof UserDetails) { username = ((UserDetails) userDetail).getUsername(); } else { username = userDetail.toString(); } out.print(username); out.print("<br><a href=\"j_acegi_logout\">注销</a>"); }else{ out.print("当前没有有效的用户"); out.print("<br><a href=\"acegilogin.jsp\">登陆</a>"); } %> </body> </html>
6.在WebRoot下创建acegilogin.jsp
<%@ page language="java" pageEncoding="UTF-8"%> <%@ page import="org.acegisecurity.ui.AbstractProcessingFilter" %> <%@ page import="org.acegisecurity.ui.webapp.AuthenticationProcessingFilter" %> <%@ page import="org.acegisecurity.AuthenticationException" %> <html> <head> <title>Login</title> </head> <body> <h1>Login</h1> <P>Valid users: <P> <P>username <b>liuyxit</b>, password <b>123</b> (supervisor) <P>username <b>user1</b>, password <b>user1</b> (normal user) <p>username <b>user2</b>, password <b>user2</b> (user disabled) <p> <% String strError = request.getParameter("login_error"); if (null != strError){ %> <font color="red"> 你的登陆失败,请重试。<BR><BR> 原因: <%= ((AuthenticationException) session.getAttribute(AbstractProcessingFilter.ACEGI_SECURITY_LAST_EXCEPTION_KEY)).getMessage() %> </font> <% }//end if %> <form action="j_acegi_security_check" method="POST"> <table> <tr><td>User:</td><td><input type='text' name='j_username' value='<%= session.getAttribute(AuthenticationProcessingFilter.ACEGI_SECURITY_LAST_USERNAME_KEY) %>'></td></tr> <tr><td>Password:</td><td><input type='password' name='j_password'></td></tr> <tr><td><input type="checkbox" name="_acegi_security_remember_me"></td><td>2周内自动登录</td></tr> <tr><td colspan='2'><input name="submit" type="submit"></td></tr> <tr><td colspan='2'><input name="reset" type="reset"></td></tr> </table> </form> </body> </html>
7.OK,发布项目,访问http://localhost:8080/acegiexample
这时index.jsp会自动转向userinfo.jsp,由于还没有用户登录,所以没有资料显示。按登陆链接进入登录页,登录成功后会看到显示用户名的页面(当然可以有更多的用户资料,但这仅仅是example),不成功时会在登录页提示信息。我们可以用user1和user2登陆,可以分别测试登录成功和失败的流程。
8.可以看到登录页上有自动登陆功能,而userinfo.jsp页有注销功能。但还是不起作用,好,现在我们马上首手加入这两个功能。看acegi可以方便到什么程度。修改applicationContext.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:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd" default-autowire="byName" default-lazy-init="true"> <!-- ======================== FILTER CHAIN ======================= --> <bean id="filterChainProxy" class="org.acegisecurity.util.FilterChainProxy" > <property name="filterInvocationDefinitionSource" > <value > CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON PATTERN_TYPE_APACHE_ANT /** =authenticationProcessingFilter,logoutFilter,rememberMeProcessingFilter,exceptionTranslationFilter </value> </property> </bean> <!-- ======================== 认证filter ======================= --> <!-- 表单认证处理filter --> <bean id="authenticationProcessingFilter" class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilter"> <property name="authenticationManager" ref="authenticationManager"/> <property name="authenticationFailureUrl" value="/acegilogin.jsp?login_error=1"/> <property name="defaultTargetUrl" value="/userinfo.jsp"/> <property name="filterProcessesUrl" value="/j_acegi_security_check"/> </bean> <!-- 利用cookie自动登陆filter --> <bean id="rememberMeProcessingFilter" class="org.acegisecurity.ui.rememberme.RememberMeProcessingFilter"> <property name="authenticationManager" ref="authenticationManager"/> <property name="rememberMeServices" ref="rememberMeServices"/> </bean> <bean id="rememberMeServices" class="org.acegisecurity.ui.rememberme.TokenBasedRememberMeServices"> <property name="userDetailsService" ref="inMemoryDaoImpl"/> <property name="key" value="javargb"/> </bean> <bean id="rememberMeAuthenticationProvider" class="org.acegisecurity.providers.rememberme.RememberMeAuthenticationProvider"> <property name="key" value="javargb"/> </bean> <!-- 注销处理filter --> <bean id="logoutFilter" class="org.acegisecurity.ui.logout.LogoutFilter"> <constructor-arg value="/acegilogin.jsp"/> <!-- URL redirected to after logout --> <constructor-arg> <list> <ref bean="rememberMeServices"/> <bean class="org.acegisecurity.ui.logout.SecurityContextLogoutHandler"/> </list> </constructor-arg> </bean> <!-- 认证管理器 --> <bean id="authenticationManager" class="org.acegisecurity.providers.ProviderManager"> <property name="providers"><!-- 可有多个认证提供器,其中一个证通过就可以了 --> <list> <ref local="daoAuthenticationProvider"/> <ref local="rememberMeAuthenticationProvider"/> </list> </property> </bean> <bean id="daoAuthenticationProvider" class="org.acegisecurity.providers.dao.DaoAuthenticationProvider"> <property name="userDetailsService" ref="inMemoryDaoImpl"/> </bean> <!-- <bean id="inMemoryDaoImpl" class="org.acegisecurity.userdetails.memory.InMemoryDaoImpl"> <property name="userProperties"> <bean class="org.springframework.beans.factory.config.PropertiesFactoryBean"> <property name="location" value="classpath:acegi/users.properties"/> </bean> </property> </bean> --> <bean id="inMemoryDaoImpl" class="org.acegisecurity.userdetails.memory.InMemoryDaoImpl"> <property name="userMap"> <value> liuyxit=123,ROLE_SUPERVISOR user1=user1,ROLE_USER user2=user2,disabled,ROLE_USER </value> </property> </bean> <!-- 异常处理filter --> <bean id="exceptionTranslationFilter" class="org.acegisecurity.ui.ExceptionTranslationFilter"> <property name="authenticationEntryPoint"> <bean class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint"> <property name="loginFormUrl" value="/acegilogin.jsp"/> <property name="forceHttps" value="false"/> </bean> </property> <property name="accessDeniedHandler"> <bean class="org.acegisecurity.ui.AccessDeniedHandlerImpl"> <property name="errorPage" value="/accessDenied.jsp"/> </bean> </property> </bean> </beans>
另要注意:Acegi默认的自动登陆设定参数名为_acegi_security_remember_me,注销链接为/j_acegi_logout。
马上重启Tomcat测试看看^_^。
9.通常用户资料会放在数据库中,而不会放在配置文件,接着下面我们来再行修改一下。
首先创建要用到的用户表和权限表,并插入初始化数据:
CREATE TABLE USERS( USERNAME VARCHAR( 50 ) NOT NULL PRIMARY KEY, PASSWORD VARCHAR( 50 ) NOT NULL, ENABLED BIT NOT NULL) INSERT INTO USERS(username,password,enabled) values( ' liuyxit ' , ' 123 ' , ' 1 ' ) INSERT INTO USERS(username,password,enabled) values( ' user1 ' , ' user1 ' , ' 1 ' ) INSERT INTO USERS(username,password,enabled) values( ' user2 ' , ' user2 ' , ' 0 ' ) CREATE TABLE AUTHORITIES( USERNAME VARCHAR( 50 ) NOT NULL, AUTHORITY VARCHAR( 50 ) NOT NULL, CONSTRAINT FK_AUTHORITIES_USERS FOREIGN KEY(USERNAME) REFERENCES USERS(USERNAME) ); INSERT INTO AUTHORITIES(USERNAME,AUTHORITY) values( ' liuyxit ' , ' ROLE_SUPERVISOR ' ) INSERT INTO AUTHORITIES(USERNAME,AUTHORITY) values( ' user1 ' , ' ROLE_USER ' ) INSERT INTO AUTHORITIES(USERNAME,AUTHORITY) values( ' user2 ' , ' ROLE_USER ' )
这里我用的是acegi默认的数据结构,可以改只要你指定JdbcDaoImpl的authoritiesByUsernameQuery和usersByUsernameQuery属性就可以了。另AUTHORITIES表也要一同加入,原因acegi获得userDetail时,也会读取这个表的内容,否则会抛“nested exception is java.sql.SQLException: 对象名 'authorities' 无效”这个异常。
修改applicationContext.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:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd" default-autowire="byName" default-lazy-init="true"> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName"> <!-- 请自行修改为对应你的数据库的驱动类 --> <value>net.sourceforge.jtds.jdbc.Driver</value> </property> <property name="url"> <!-- 请自行修改为对应你的数据库URL --> <value>jdbc:jtds:sqlserver://localhost:1433/javauser</value> </property> <property name="username"> <value>sa</value> </property> <property name="password"> <value>javauser</value> </property> </bean> <!-- ======================== FILTER CHAIN ======================= --> <bean id="filterChainProxy" class="org.acegisecurity.util.FilterChainProxy"> <property name="filterInvocationDefinitionSource"> <value> CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON PATTERN_TYPE_APACHE_ANT /**=authenticationProcessingFilter,logoutFilter,rememberMeProcessingFilter,exceptionTranslationFilter </value> </property> </bean> <!-- ======================== 认证filter ======================= --> <!-- 表单认证处理filter --> <bean id="authenticationProcessingFilter" class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilter"> <property name="authenticationManager" ref="authenticationManager"/> <property name="authenticationFailureUrl" value="/acegilogin.jsp?login_error=1"/> <property name="defaultTargetUrl" value="/userinfo.jsp"/> <property name="filterProcessesUrl" value="/j_acegi_security_check"/> </bean> <!-- 利用cookie自动登陆filter --> <bean id="rememberMeProcessingFilter" class="org.acegisecurity.ui.rememberme.RememberMeProcessingFilter"> <property name="authenticationManager" ref="authenticationManager"/> <property name="rememberMeServices" ref="rememberMeServices"/> </bean> <bean id="rememberMeServices" class="org.acegisecurity.ui.rememberme.TokenBasedRememberMeServices"> <property name="userDetailsService" ref="jdbcDaoImpl"/> <property name="key" value="javargb"/> </bean> <bean id="rememberMeAuthenticationProvider" class="org.acegisecurity.providers.rememberme.RememberMeAuthenticationProvider"> <property name="key" value="javargb"/> </bean> <!-- 注销处理filter --> <bean id="logoutFilter" class="org.acegisecurity.ui.logout.LogoutFilter"> <constructor-arg value="/acegilogin.jsp"/> <!-- URL redirected to after logout --> <constructor-arg> <list> <ref bean="rememberMeServices"/> <bean class="org.acegisecurity.ui.logout.SecurityContextLogoutHandler"/> </list> </constructor-arg> </bean> <!-- 认证管理器 --> <bean id="authenticationManager" class="org.acegisecurity.providers.ProviderManager"> <property name="providers"><!-- 可有多个认证提供器,其中一个证通过就可以了 --> <list> <ref local="daoAuthenticationProvider"/> <ref local="rememberMeAuthenticationProvider"/> </list> </property> </bean> <bean id="daoAuthenticationProvider" class="org.acegisecurity.providers.dao.DaoAuthenticationProvider"> <property name="userDetailsService" ref="jdbcDaoImpl"/> </bean> <bean id="jdbcDaoImpl" class="org.acegisecurity.userdetails.jdbc.JdbcDaoImpl"> <property name="dataSource"><ref bean="dataSource"/></property> </bean> <!-- 异常处理filter --> <bean id="exceptionTranslationFilter" class="org.acegisecurity.ui.ExceptionTranslationFilter"> <property name="authenticationEntryPoint"> <bean class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint"> <property name="loginFormUrl" value="/acegilogin.jsp"/> <property name="forceHttps" value="false"/> </bean> </property> <property name="accessDeniedHandler"> <bean class="org.acegisecurity.ui.AccessDeniedHandlerImpl"> <property name="errorPage" value="/accessDenied.jsp"/> </bean> </property> </bean> </beans>
OK,大功告成。
后记:很少写技术文章,除了要坚持之外,文笔和思路都很重要。感觉自己的写作水平太差了,希望大家指出不合理的地方。有时间我会再写后篇《学习Acegi-授权(authorization)》,感谢大家把拙文看完,TKS!
评论
23 楼
jayuton
2007-08-29
我也正在学习之中,看了,受益匪浅!
22 楼
sharong
2007-08-28
楼主关于Acegi授权的帖子还没有发呀,都快半年了
21 楼
wurenjian
2007-08-24
讲得不错,学习一下
20 楼
leeking
2007-08-21
wl1985 写道
<bean id="jdbcDaoImpl" class="org.acegisecurity.userdetails.jdbc.JdbcDaoImpl">
<property name="dataSource"><ref bean="dataSource"/></property>
</bean>
这个似乎少了两个属性参数
<property name="usersByUsernameQuery">
<value>SELECT username,password,enabled FROM app_user WHERE username = ?</value>
</property>
<property name="authoritiesByUsernameQuery">
<value>SELECT username,role_name FROM user_role WHERE username = ?</value>
</property>
<property name="dataSource"><ref bean="dataSource"/></property>
</bean>
这个似乎少了两个属性参数
<property name="usersByUsernameQuery">
<value>SELECT username,password,enabled FROM app_user WHERE username = ?</value>
</property>
<property name="authoritiesByUsernameQuery">
<value>SELECT username,role_name FROM user_role WHERE username = ?</value>
</property>
应该是对的吧.
19 楼
leeking
2007-08-21
没明白 用户验证的地方,怎么验证的,开始是把用户信息写成了<value>aaa=123</value>这种形式,可后来转换为数据库后,只写了个daoimp类,然后又指定的数据原,在后来就没明白了
18 楼
wl1985
2007-08-18
<bean id="jdbcDaoImpl" class="org.acegisecurity.userdetails.jdbc.JdbcDaoImpl">
<property name="dataSource"><ref bean="dataSource"/></property>
</bean>
这个似乎少了两个属性参数
<property name="usersByUsernameQuery">
<value>SELECT username,password,enabled FROM app_user WHERE username = ?</value>
</property>
<property name="authoritiesByUsernameQuery">
<value>SELECT username,role_name FROM user_role WHERE username = ?</value>
</property>
<property name="dataSource"><ref bean="dataSource"/></property>
</bean>
这个似乎少了两个属性参数
<property name="usersByUsernameQuery">
<value>SELECT username,password,enabled FROM app_user WHERE username = ?</value>
</property>
<property name="authoritiesByUsernameQuery">
<value>SELECT username,role_name FROM user_role WHERE username = ?</value>
</property>
17 楼
songxh2
2007-08-11
acegi的登陆消息只在login.jsf?error=true这个链接上体现错误,但是详细错误怎么获得呢?是没有这个用户名?还是密码错误?还是没用enabled。。
有人知道怎么处理更加详细的登录错误消息吗?
有人知道怎么处理更加详细的登录错误消息吗?
16 楼
jiwenke
2007-08-02
对acegi不是很熟悉但很感兴趣,请问如果通过了认证以后,相关的应用代码怎样获得当前主体的信息?比如登录的用户名什么的,因为有时候应用代码需要的到这些相关的信息来进行相关的处理。只看到说这些信息会存在ContextHolder里面,但具体怎么取出来使用呢?看了一下手册,是不是这样使用:
Inside the SecurityContextHolder we store details of the principal currently interacting with the application. Acegi Security uses an Authentication object to represent this information. Whilst you won't normally need to create an Authentication object yourself, it is fairly common for users to query the Authentication object. You can use the following code block - from anywhere in your application - to do this:
Inside the SecurityContextHolder we store details of the principal currently interacting with the application. Acegi Security uses an Authentication object to represent this information. Whilst you won't normally need to create an Authentication object yourself, it is fairly common for users to query the Authentication object. You can use the following code block - from anywhere in your application - to do this:
Object obj = SecurityContextHolder.getContext().getAuthentication().getPrincipal(); if (obj instanceof UserDetails) { String username = ((UserDetails)obj).getUsername(); } else { String username = obj.toString(); }
15 楼
morle
2007-06-22
i study from this.thanks you~
please go ahead!!!
14 楼
chenlb
2007-04-21
选择"2周内自动登录"时
不稳定
单次正常,偶次时还是要登录
奇怪
不稳定
单次正常,偶次时还是要登录
奇怪
13 楼
ricsson
2007-04-04
按楼主说的做,报错,检查所有文件和库已经在TOMCAT_HOME/webapps/下,不知原因何在?
HTTP Status 404 - /acegiexample/
type Status report
message /acegiexample/
description The requested resource (/acegiexample/) is not available.
Apache Tomcat/5.5.20
我的环境(Eclipse3.2+MyEclipse5.1+Tomcat5.5)
HTTP Status 404 - /acegiexample/
type Status report
message /acegiexample/
description The requested resource (/acegiexample/) is not available.
Apache Tomcat/5.5.20
我的环境(Eclipse3.2+MyEclipse5.1+Tomcat5.5)
12 楼
jamesby
2007-04-02
cjcmailcjc 写道
按楼主说的做,报错,原因何在?
严重: Error listenerStart
2007-4-2 18:10:17 org.apache.catalina.core.StandardContext start
严重: Context startup failed due to previous errors
listener启动出现错误,应该是缺少某个包!严重: Error listenerStart
2007-4-2 18:10:17 org.apache.catalina.core.StandardContext start
严重: Context startup failed due to previous errors
11 楼
cjcmailcjc
2007-04-02
按楼主说的做,报错,原因何在?
严重: Error listenerStart
2007-4-2 18:10:17 org.apache.catalina.core.StandardContext start
严重: Context startup failed due to previous errors
严重: Error listenerStart
2007-4-2 18:10:17 org.apache.catalina.core.StandardContext start
严重: Context startup failed due to previous errors
10 楼
xmlspy
2007-03-30
这些其实都不怎么难,
主要是多个程序如何整合,也就是单点登录
比如 : 原先的web站点,论坛(mvnforum),blog(jroller),
这些东西如何整合?
更详细的信息可以看看这个: http://xmlspy.iteye.com/admin/show/66745
主要是多个程序如何整合,也就是单点登录
比如 : 原先的web站点,论坛(mvnforum),blog(jroller),
这些东西如何整合?
更详细的信息可以看看这个: http://xmlspy.iteye.com/admin/show/66745
9 楼
小嘴看世界
2007-03-30
温柔一刀 写道
把demo打包上来效果会更好
把权限放在数据库存储会更实用
把权限放在数据库存储会更实用
是阿,打个包更方便看了,已经收藏了,好文章
8 楼
liupopo
2007-03-30
写的很好啊,支持一下,新作期待中......
7 楼
Y04069
2007-03-26
learning~
6 楼
dearwolf
2007-03-13
楼主关于内部细节的问题讲的还是有点粗略,不过作为入门性文章,已经很不错了,详细的东西毕竟还有open source的document
5 楼
温柔一刀
2007-03-13
把demo打包上来效果会更好
把权限放在数据库存储会更实用
把权限放在数据库存储会更实用
4 楼
justcode
2007-03-13
说实话,我从中受益了.
相关推荐
### Acegi认证服务详解 #### 一、Acegi简介与背景 Acegi是Spring Security的前身,是一款基于Spring框架的安全管理工具,旨在为应用程序提供安全控制功能,包括身份验证(Authentication)和授权(Authorization)...
4. **异常处理(Exception Handling)**:Acegi Security处理与安全相关的异常,如未授权(Unauthorized)和未认证(Not Authenticated)异常,提供了一种统一的方式来处理这些问题。 5. **过滤器链(Filter Chain)...
5. 集成其他安全机制:如与LDAP服务器集成进行目录服务认证,或者与CAS(Central Authentication Service)等单点登录系统集成。 尽管Acegi Security已被Spring Security替代,但它的设计理念和实现方式对理解现代...
通过将这些示例代码导入到自己的项目并添加注释,我们可以更深入地学习如何配置和使用Acegi来保护我们的应用程序。 首先,Acegi Security的核心功能是身份验证(Authentication)和授权(Authorization)。身份验证...
1. **Authentication**(身份验证):Acegi Security提供了多种认证策略,如基于数据库、LDAP、JAAS等。它支持用户名/密码、数字证书等多种认证方式。开发者可以自定义认证处理过程,以适应不同的安全需求。 2. **...
Acegi Security的核心功能是为Java应用程序提供身份验证(Authentication)和授权(Authorization)服务,它能够帮助开发者构建安全的Web应用程序。在Spring框架中,Acegi Security作为一个插件存在,可以无缝集成到...
2. acegi-security-cas-1.0.5.jar:这个组件与Central Authentication Service (CAS)集成,CAS是一种集中式的身份验证服务。通过此组件,Acegi Security可以与CAS服务器交互,支持单点登录(Single Sign-On, SSO)...
1. **身份验证(Authentication)**:Acegi Security提供了多种身份验证机制,如基于数据库的用户名/密码验证,LDAP验证,甚至是X.509证书验证。它允许开发者灵活地定义认证流程,以便适应不同应用的需求。 2. **...
它接收认证请求(Authentication)并返回一个认证结果(Authentication)。Acegi Security支持多种认证策略,如基于数据库的用户名/密码验证,或者通过LDAP服务进行身份验证。 2. **AccessDecisionManager**: 这个...
Acegi Security是一款在Java应用程序中实现安全控制的框架,它为Spring框架提供了强大的身份验证和授权功能。在Java世界中,安全通常是应用开发中的一个重要环节,Acegi Security为开发者提供了全面的安全解决方案,...
Acegi Security的核心功能在于提供了一套全面的安全解决方案,包括用户认证(Authentication)、权限管理(Authorization)以及会话管理等。它通过与Spring框架的紧密集成,使得开发者可以方便地在Spring应用中实现...
Acegi Security是一款已退役的安全框架,它为Java应用程序提供了全面的身份验证、授权和服务层安全...通过深入学习Acegi Security,开发者可以更好地理解现代Web应用安全的基础,并为向更新的安全框架迁移做好准备。
**ACEGI 安全框架详解** ACEGI Security(Acceleo ...虽然现在Spring Security已经取代了ACEGI,但其设计理念和许多核心概念在Spring Security中得到了延续,理解ACEGI对于学习现代Java安全框架仍然有重要价值。
Acegi Security的核心功能在于提供身份验证(Authentication)和授权(Authorization)服务。身份验证涉及到验证用户的身份,例如通过用户名和密码进行登录;而授权则是确定验证后的用户是否有权限访问特定的资源或...
使用Acegi Security时,开发者需要配置安全上下文(Security Context),定义访问控制规则,以及设置用户认证和授权的策略。在Jetty环境中,Acegi Security的配置可能涉及到创建自定义的过滤器链,这些过滤器会在...
此压缩包"acegi-security-cas-0.9.0.jar.zip"包含了Acegi Security与CAS(Central Authentication Service)集成的0.9.0版本的组件。CAS是一个开源的身份验证框架,常用于实现单点登录(Single Sign-On, SSO)功能。...
Acegi Security与CAS(Central Authentication Service)的集成则允许应用程序利用CAS服务器进行集中式的身份验证。CAS是一个开源项目,旨在为Web应用程序提供单一登录(Single Sign-On, SSO)功能。通过集成Acegi ...
Acegi Security CAS 0.8.1 是一个用于Java企业级应用的安全框架,它与CAS(Central Authentication Service)集成,提供了强大的身份验证和授权功能。这个框架是Acegi Security项目的一部分,旨在为Spring应用程序...
它包括了认证(Authentication)、授权(Authorization)、会话管理(Session Management)以及一系列其他安全特性,如CSRF(跨站请求伪造)防护和XSS(跨站脚本攻击)防护等。这个0.7.1版本可能包含了一些修复的bug...
Acegi Security CAS 0.7.1 是一个用于Java企业级应用的安全框架,它与CAS(Central Authentication Service)集成,提供了强大的身份验证和授权功能。这个压缩包`acegi-security-cas-0.7.1.jar.zip`包含了Acegi ...