Spring security学习笔记二

一、简单配置

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权限可以访问


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值