当前位置:编程学习 > JAVA >>

java笔记:SpringSecurity应用(二)

这里我首先对我上一篇博文的第三个实例做一下讲解,下面是applicationContext-security.xml内容如下:

<?xml version="1.0" encoding="UTF-8"?><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">    <!-- 自动配置模式,拦截所有请求,有ROLE_USER才可以通过 -->    <http auto-config="true">        <intercept-url pattern="/login.jsp*"  access="IS_AUTHENTICATED_ANONYMOUSLY" />        <!-- 增加 ROLE_ADMIN角色-->        <intercept-url pattern="/admin.jsp" access="ROLE_ADMIN"/>        <intercept-url pattern="/**" access="ROLE_USER"/>        <form-login login-page="/login.jsp" authentication-failure-url="/login.jsp?login_error=1"/>     </http>    <!-- 认证管理器。用户名密码都集成在配置文件中 -->     <authentication-manager>        <authentication-provider>            <user-service>                <!-- 添加ROLE_ADMIN角色 -->                <user name="admin" password="admin" authorities="ROLE_USER,ROLE_ADMIN"/>                <user name="sharp" password="sharp" authorities="ROLE_USER"/>            </user-service>        </authentication-provider>    </authentication-manager>    <!-- 指定中文资源 。默认命名空间是security,所以要加前缀beans: -->      <beans:bean id="messageSource"          class="org.springframework.context.support.ReloadableResourceBundleMessageSource">         <beans:property name="basename"  value="classpath:org/springframework/security/messages_zh_CN"/>       </beans:bean></beans:beans>该配置文件的注解如下:

<http auto-config="true">,这一部分是配置如何拦截用户请求,auto-config="true"将自动配置几个常用的权限机制,包括form,anonymous,rememberMe.(这几种机制我也不太不明白) 。
 我们利用intercept-url来判断用户需要何种权限才能访问对应的url资源,可以在pattern中指定一个特定的url资源,也可以使用通配符来指定一组类似的url资源。例子中定义的两个intercepter-url,第一个用来控制对/admin.jsp的访问,第二个使用了通配符/**,说明它将控制对系统中所有url资源的访问。在实际使用中,Spring Security采用的是一种就近原则,就是说当用户访问的url资源满足多个intercepter-url时,系统将使用第一个符合条件的intercept-url进行权限控制。在我们这个例子中就是,当用户访问/admin.jsp时,虽然两个intercept-url都满足要求,但因为第一个intercept-url排在上面,所以Spring Security会使用第一个intercept-url中的配置处理对/admin.jsp的请求,也就是说,只有那些拥有了ROLE_ADMIN权限的用户才能访问/admin.jsp。access指定的权限部分比较有趣,大家可以注意到这些权限标示符都是以ROLE_开头的,实际上这与Spring Security中的Voter机制有着千丝万缕的联系,只有包含了特定前缀的字符串才会被Spring Security处理。目前来说我们只需要记住这一点就可以了,在我文章以后的部分中我们会详细讲解Voter的内容。(这里就解释了我在上面一个文章里,sharp拥有/**所有页面权限,为什么sharp用户却不能访问admin.jsp的原因)
user-service中定义了两个用户,admin和user。为了简便起见,我们使用明文定义了两个用户对应的密码,这只是为了当前演示的方便,之后的例子中我们会使用Spring Security提供的加密方式,避免用户密码被他人窃取。最最重要的部分是authorities,这里定义了这个用户登陆之后将会拥有的权限,它与上面intercept-url中定义的权限内容一一对应。每个用户可以同时拥有多个权限,例子中的admin用户就拥有ROLE_ADMIN和ROLE_USER两种权限,这使得admin用户在登陆之后可以访问ROLE_ADMIN和ROLE_USER允许访问的所有资源。与之对应的是,user用户就只拥有ROLE_USER权限,所以他只能访问ROLE_USER允许访问的资源,而不能访问ROLE_ADMIN允许访问的资源。


第四个实例:

这个实例里面用户信息存入到数据库里,我使用的是数据库是

create table USERS(  USERNAME VARCHAR2(64) not null,  PASSWORD VARCHAR2(64),  ENABLED  NUMBER)comment on column USERS.USERNAME  is '用户名';comment on column USERS.PASSWORD  is '密码';comment on column USERS.ENABLED  is '0--不可用;1--可用';alter table USERS  add constraint PK_USERS primary key (USERNAME)create table AUTHORITIES(  USERNAME  VARCHAR2(64) not null,  AUTHORITY VARCHAR2(64) not null)tablespace ANDROIDXIAJUN  pctfree 10  initrans 1  maxtrans 255  storage  (    initial 64K    minextents 1    maxextents unlimited  );alter table AUTHORITIES  add constraint INDEX_USER_AUTH unique (USERNAME, AUTHORITY)alter table AUTHORITIES  add constraint USER_AUTHORITIES_FK foreign key (USERNAME)  references USERS (USERNAME);数据库表创建好后,我们插入一些测试数据:


insert into users(username,password,enabled) values('admin','admin',1);insert into users(username,password,enabled) values('sharp','sharp',1);insert into authorities(username,authority) values('admin','ROLE_ADMIN');insert into authorities(username,authority) values('admin','ROLE_USER');insert into authorities(username,authority) values('sharp','ROLE_USER');
数据库的表建好,里面数据也有了,接下来就是修改我们原来的程序了。前面的三个实例都是在配置文件里配置好用户信息,而且还是明文的,如果换成数据库我们只要把这个部分的内容更改下:

 

    <!-- 认证管理器。用户名密码都集成在配置文件中 -->     <authentication-manager>        <authentication-provider>            <user-service>                <!-- 添加ROLE_ADMIN角色 -->                <user name="admin" password="admin" authorities="ROLE_USER,ROLE_ADMIN"/>                <user name="sharp" password="sharp" authorities="ROLE_USER"/>            </user-service>        </authentication-provider>    </authentication-manager>
修改的新内容是:

 

    <!-- 认证管理器。用户名密码从数据库里读取 -->     <auth

补充:软件开发 , Java ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,