一、简单配置
1、在web.xml文件中添加一个过滤器,这个过滤器不在security包中. ,它可以代理一个application context中定义的Spring bean所实现的filter。DelegatingFilterProxy做的事情是代理Filter的方法,从application context里获得bean(这些bean就是Spring Security 中的核心部分,过滤器。这些过滤器被定义在了Spring容器中)。 这让bean可以获得spring web application context的生命周期支持,使配置较为轻便。 bean必须实现javax.servlet.Filter接口,它必须和filter-name里定义的名称是一样的。
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<!--拦截所以请求 -->
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
2、在spring的配置文件中引入security的命名空间,然后在spring的配置文件中配置,web中保护的资源、访问这些资源需要什么权限以及这些权限在认证管理器中的配置。
<security:http auto-config="true">
<security:form-login login-page="/login.jsp" /> <!--指定登录页面 -->
<!--这表示,拦截所有URL,只有拥有 ROLE_USER角色的用户才能访问 -->
<security:intercept-url pattern="/**" access="ROLE_USER"/>
</security:http>
<!-- 配置认证管理器 -->
<security:authentication-manager>
<security:authentication-provider>
<security:password-encoder hash="md5"/> <!-- 密码加密方式 -->
<security:user-service>
<!--用户是user,密码是user的用户登录成功之后他的角色就是ROLE_USER -->
<security:user name="admin" password="21232f297a57a5a743894a0e4a801fc3" authorities="ROLE_USER" />
</security:user-service>
</security:authentication-provider>
</security:authentication-manager>
3、部署访问,将项目部署到web服务器中,然后访问首页index.jsp,我们发现首页并没有出现,而是跳转到了 一个登录页面上。因为项目刚启动,第一次访问的时候,没有任何用户登录,而在配置文件中我们拦截的是所有的请求,所以第一次请求被拦截了。我们输入用户名user和密码user,提交之后发现可以正确访问首页。
当有请求道来的时候,Spring Security框架开始检查要访问的资源是否有权访问,如果当前登录用户无权或者当前根本就没有用户登录,则Spring Securtiy 框架就自动产生一个 登录页面。当在登录页面进行了正确的登录后,Spring Security会自动进行登录验证,如果成功登录,将用户信息放到session中,然后转到先前请求的页面上。
4、查看登录页面源码我们可以发现,登录请求时发送给:${pageContext.request.contextPath}/j_spring_security_check
表单数据是:<input name="j_username" type="text"/>、<input name="j_password" type="password"/>这样我们就可以自己指定登录页面然后将请求发送给认证系统进行登录,指定登录页面在spring中的配置是
<!-- 访问路径为 /login.jsp* 是不进行拦截-->
<security:http pattern="/login.jsp*" security="none"/>
5、将数据权限放到数据库中保存
新建数据库表users、authorities分别用了存放用户和权限,
/*用户表*/
create table users
(
username varchar(50) not null primary key, /*用户名*/
password varchar(50) not null, /*密码*/
enabled boolean not null /*是否禁用*/
);
/*权限表*/
create table authorities
(
username varchar(50) not null,
authority varchar(50) not null,
constraint fk_authorities_users foreign key(username) references users(username)
);
users 用户表中数据
authorities权限表
在spring配置文件中配置数据源
<!-- 配置数据源 -->
<bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/spsecy?useUnicode=true&characterEncoding=utf-8" />
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>
配置security属性
<!-- 访问路径为 /login.jsp* 是不进行拦截-->
<security:http pattern="/login.jsp*" security="none"/>
<security:http auto-config="true" access-denied-page="/accessDenied.jsp"><!--指定被拒绝的页面 -->
<security:form-login login-page="/login.jsp" /> <!--指定登录页面 -->
<!--这表示,拦截所有URL,只有拥有 ROLE_USER角色的用户才能访问 -->
<security:intercept-url pattern="/admin.jsp" access="ROLE_ADMIN"/>
<security:intercept-url pattern="/index.jsp" access="ROLE_USER,ROLE_ADMIN"/>
</security:http>
<!-- 配置认证管理器 -->
<security:authentication-manager>
<security:authentication-provider>
<security:password-encoder hash="md5"/><!--密码加密方式 -->
<!--将原来的user-service注释起来,再提供一个userService,使用配置的dataSource -->
<security:jdbc-user-service data-source-ref="datasource"/>
</security:authentication-provider>
</security:authentication-manager>
我们可以得到效果:
A) 系统中除了login.jsp可以直接访问以外,其它的页面都需要权限才能进入
B) index.jsp页面 ROLE_USER 和ROLE_ADMIN都可以访问;
C) admin.jsp页面只有ROLE_ADMIN权限可以访问