数据加载中……
spring acegi 官方例子
2008年4月12日  edited by dingdangxiaoma
acegi安全是一个强大的,灵活的安全解决方案的企业软件,并特别着重于应用,利用spring。用acegi安全,为用户的应用与全面的认证,授权,例如基于职务的访问控制,通道安全和人类用户检测能力。(google 对acegid的翻译)
参考资料:http://www.tfo-eservices.eu/wb_tutorials/media/SpringAcegiTutorial/HTML/SpringAcegiTutorial-1_1-html.html
里面有一个例子:SpringAcegiTutorial,可以进行下载,并运行,做为一个实例,已经相当不错了。
讲述了admin ,user的登录问题。及权限控件,acegi 的配置。
这个例子是spring mvc + spring acegi 的例子,阅读前最好有spring mvc 的基础。这里只摘录简单的配置说明。
<!-- ****** START ACEGI Security Configuration *******-->
    
<!-- ======================== FILTER CHAIN ======================= -->

    
<!--  if you wish to use channel security, add "channelProcessingFilter," in front
        of 
"httpSessionContextIntegrationFilter" in the list below -->
    
<bean id="filterChainProxy"
        
class="org.acegisecurity.util.FilterChainProxy">
        
<property name="filterInvocationDefinitionSource">
            
<value>
                CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
                PATTERN_TYPE_APACHE_ANT
                
/**=httpSessionContextIntegrationFilter,formAuthenticationProcessingFilter,exceptionTranslationFilter,filterSecurityInterceptor
            </value>
        </property>
    </bean>

    <!-- Start Security filter config -->
    <bean id="exceptionTranslationFilter"
        class="org.acegisecurity.ui.ExceptionTranslationFilter">
        <property name="authenticationEntryPoint">
            <ref bean="formLoginAuthenticationEntryPoint" />
        </property>
    </bean>

    <!-- Define filter to handle BASIC authentication -->
    <bean id="basicProcessingFilter"
        class="org.acegisecurity.ui.basicauth.BasicProcessingFilter">
        <property name="authenticationManager">
            <ref bean="authenticationManager" />
        </property>
        <property name="authenticationEntryPoint">
            <ref bean="authenticationEntryPoint" />
        </property>
    </bean>

    <!-- Define realm for BASIC login-->
    <bean id="authenticationEntryPoint"
        class="org.acegisecurity.ui.basicauth.BasicProcessingFilterEntryPoint">
        <property name="realmName">
            <value>Spring Web Realm</value>
        </property>
    </bean>

    <!-- Define filter to handle FORM authentication -->
    <bean id="formAuthenticationProcessingFilter"
        class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilter">
        <property name="filterProcessesUrl">
            <value>/j_acegi_security_check</value>
        </property>
        <property name="authenticationFailureUrl">
            <value>/loginFailed.html</value>
        </property>
        <property name="defaultTargetUrl">
            <value>/</value>
        </property>
        <property name="authenticationManager">
            <ref bean="authenticationManager" />
        </property>
    </bean>

    <!-- Define realm for FORM login-->
    <bean id="formLoginAuthenticationEntryPoint"
        class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint">
        <property name="loginFormUrl">
            <value>/login.jsp</value>
        </property>
        <property name="forceHttps">
            <value>false</value>
        </property>
    </bean>

    <bean id="httpSessionContextIntegrationFilter"
        class="org.acegisecurity.context.HttpSessionContextIntegrationFilter">
    </bean>
    <!-- End Security filter config -->

    <!-- Start Security interceptor config -->
    <!-- Define authentication manager, decision manager and secure URL patterns -->
    <bean id="filterSecurityInterceptor"
        class="org.acegisecurity.intercept.web.FilterSecurityInterceptor">
        <property name="authenticationManager">
            <ref bean="authenticationManager" />
        </property>
        <property name="accessDecisionManager">
            <ref bean="accessDecisionManager" />
        </property>
        <property name="objectDefinitionSource">
            <value>
                CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
                PATTERN_TYPE_APACHE_ANT 
                /secure/admin/*=ROLE_ADMIN
                /secure/app/*=ROLE_USER
            </value>
        </property>
    </bean>
    <!-- End Security interceptor config -->

    <!-- Start authentication config -->
    <bean id="authenticationManager"
        class="org.acegisecurity.providers.ProviderManager">
        <property name="providers">
            <list>
                <ref bean="daoAuthenticationProvider" />
            </list>
        </property>
    </bean>

    <bean id="daoAuthenticationProvider"
        class="org.acegisecurity.providers.dao.DaoAuthenticationProvider">
        <property name="userDetailsService">
            <ref bean="userDetailsService" />
        </property>
    </bean>

    <!-- Authentication using In-memory Dao -->
   
    <bean id="userDetailsService"
        class="org.acegisecurity.userdetails.memory.InMemoryDaoImpl">
        <property name="userMap">
            <value>
                jklaassen=4moreyears,ROLE_ADMIN
                bouerj=ineedsleep,ROLE_USER
            </value>
        </property>
    </bean>
    <!-- Authentication using JDBC Dao -->
<!--
     <bean id="userDetailsService"
        class="org.acegisecurity.userdetails.jdbc.JdbcDaoImpl">
        <property name="dataSource">
        <ref bean="dataSource"/>
        </property>
        </bean>
-->
        <!-- End authentication config -->

    <!-- Start authorization config -->
    <bean id="accessDecisionManager"
        class="org.acegisecurity.vote.UnanimousBased">
        <property name="decisionVoters">
            <list>
                <ref bean="roleVoter" />
            </list>
        </property>
    </bean>

    <bean id="roleVoter" class="org.acegisecurity.vote.RoleVoter">
        <property name="rolePrefix">
            <value>ROLE_</value>
        </property>
    </bean>
    <!-- End authorization config -->

    <!-- ****** END ACEGI Security Configuration *******-->
以上就是所有的源代码配置在spring 的配置文件中。详细的说明在官方的文档上。
在上面的配置文件的方式是以in-memory 的方法,也就是在配置文件中指定登录的用户名及密码。在实际的应用中,应用到数据库或其它技术。
     <bean id="userDetailsService"
        class="org.acegisecurity.userdetails.jdbc.JdbcDaoImpl">
        <property name="dataSource">
        <ref bean="dataSource"/>
        </property>
        </bean>

    
<bean id="dataSource"
        
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        
<property name="driverClassName">
            
<value>com.mysql.jdbc.Driver</value>
        
</property>
        
<property name="url">
            
<value>jdbc:mysql://localhost:3306/test</value>
        </property>
        
<property name="username">
            
<value>root</value>
        
</property>
        
<property name="password">
            
<value>1</value>
        
</property>
    
</bean>
以上两个bean的代码就是把信息存储到数据库中。
sql 语句如下:
CREATE TABLE `users` (
  `username` varchar(
50) NOT NULL,
  `password` varchar(
50) NOT NULL,
  `enabled` varchar(
50) NOT NULL,
  PRIMARY KEY (`username`)
) ENGINE
=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `users` VALUES (
'dianne','emu','true');
INSERT INTO `users` VALUES (
'marissa','koala','true');
INSERT INTO `users` VALUES (
'peter','opal','true');
INSERT INTO `users` VALUES (
'scott','wombat','true');

CREATE TABLE `authorities` (
  `username` varchar(50) NOT NULL,
  `authority` varchar(50) NOT NULL,
  UNIQUE KEY `ix_auth_username` (`username`,`authority`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `authorities` VALUES ('dianne','ROLE_ADMIN');
INSERT INTO `authorities` VALUES ('marissa','ROLE_ADMIN');
INSERT INTO `authorities` VALUES ('marissa','ROLE_USER');
INSERT INTO `authorities` VALUES ('peter','ROLE_USER');
INSERT INTO `authorities` VALUES ('scott','ROLE_ADMIN');
ALTER TABLE `authorities`
ADD FOREIGN KEY (`username`) REFERENCES `users` (`username`);
所有的配置就是这些:
理解一下原理:
1。acegi的添加,可以在程序写完之后再添加,配置灵活但并不简单。
2.四个步骤:
安全是实施这四项检查:

    1 限制出入检查(是以资源担保? ) ;
    2 现有的认证检查(有用户被认证? ) ;
    3 如果没有有效的登录用户:认证要求退房(都是正确的用户名和密码提供? ) ;
    4 授权入住(不含用户拥有所需的角色? ) ;
3.对于授权的处理,未授权的用户无法进行访问。应该设置 403.jsp未授权页面。

posted on 2008-04-12 13:50 叮当小马 阅读(1538) 评论(1)  编辑  收藏 所属分类: Spring

评论

# re: spring acegi 官方例子 2008-04-12 13:52 叮当小马

对于SpringAcegiTutorial的例子,可以到我的csdn的官方下载,另外.pdf的文件也提供下载。
  回复  更多评论    

只有注册用户登录后才能发表评论。


网站导航: