zoukankan      html  css  js  c++  java
  • Spring Security

    Spirng Security主要涵盖的方面有

    1. 登录验证管理,包括登录成功后保存用户信息到Session

    2. URL级别和Controller方法级别的访问控制

    3. 对于访问控制采取的授权管理方法,包括用户授权和用户组授权

    下面是例子

    security-config.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans:beans xmlns="http://www.springframework.org/schema/security"
                 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.xsd
                 http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.xsd"
                 xmlns:beans="http://www.springframework.org/schema/beans">
        <!-- auto-config表示开启自动的<form-login>(权限验证失败回到登录页面) <http-basic>(权限验证失败弹框) <logout>(提供登出链接) -->
        <!-- use-expressions表示在access是可以使用函数如hasAnyRole -->
        <http auto-config="false" use-expressions="true">
            <!-- url级别访问控制 -->
            <intercept-url pattern="/hotel/list"
                           access="hasAnyRole('${role.admin}', '${role.user}')" />
            <intercept-url pattern="/hotel/add"
                           access="hasRole('${role.admin}')" />
            <intercept-url pattern="/hotel/delete"
                           access="hasRole('${role.admin}')" />
            <!--<intercept-url pattern="/login" requires-channel="https" />-->
    
            <!-- 自定义登录页面,登录验证url(验证方法还是由SpringSecurity提供,不需要自己实现) -->
            <!-- 登录成功后访问url,登录失败后访问url -->
            <form-login login-page="/login.jsp"
                        login-processing-url="/login"
                        default-target-url="/hotel/list"
                        authentication-failure-url="/login.jsp?error=true" />
            <!-- 登出成功后访问url -->
            <logout logout-success-url="/login.jsp" />
            <!-- 自动登录key以及保存时间 -->
            <remember-me key="userLoginKey" token-validity-seconds="2419200" />
        </http>
    
        <!-- 自定义数据用户登录验证方法 -->
        <authentication-manager>
            <authentication-provider>
                <!--<password-encoder hash="md5" ref="passwordEncoder">-->
                    <!--<salt-source ref="saltSource" />-->
                <!--</password-encoder>-->
                <!-- 以下一次为用户登录验证sql,用户个人权限查询sql,以及用户组权限查询sql -->
                <!-- 这些sql会在用户登录验证,访问控制时查询 -->
                <jdbc-user-service
                        data-source-ref="dataSource"
                        users-by-username-query=
                                "SELECT username, password, enabled
                                FROM `user`
                                WHERE username = ?"
                        authorities-by-username-query=
                                "SELECT gm.username AS username, ga.group_authority AS authority
                                FROM group_authority AS ga
                                JOIN group_member AS gm ON ga.group_id = gm.group_id
                                WHERE gm.username = ?"
                        group-authorities-by-username-query=
                                "SELECT g.id, g.name AS group_name, ga.group_authority AS authority
                                FROM `group` AS g
                                JOIN group_authority AS ga ON g.id = ga.group_id
                                JOIN group_member AS gm ON g.id = gm.group_id
                                WHERE gm.username = ?"
                />
            </authentication-provider>
        </authentication-manager>
    
    </beans:beans>

    login.jsp

    <%--
      Created by IntelliJ IDEA.
      User: zhenwei.liu
      Date: 13-7-30
      Time: 上午10:22
      To change this template use File | Settings | File Templates.
    --%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <%@ page contentType="text/html;charset=UTF-8" pageEncoding="utf-8" %>
    <html>
    <head>
        <title>登录</title>
        <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    </head>
    <body>
    <%-- ERROR 信息 --%>
    <c:if test="${not empty param.error}">
        Error: ${sessionScope["SPRING_SECURITY_LAST_EXCEPTION"].message}
    </c:if>
    <%-- Login 表单 --%>
    <%-- 注意此处用户名和密码以及"记住我"的name都是用spring默认的 --%>
    <form action="<c:url value="/login" />" method="POST">
        <table>
            <tr>
                <td align="right">用户名</td>
                <td><input type="text" name="j_username"/></td>
            </tr>
            <tr>
                <td align="right">密码</td>
                <td><input type="password" name="j_password"/></td>
            </tr>
            <tr>
                <td></td>
                <td align="right">记住我 &nbsp
                    <input id="remember_me"
                           name="_spring_security_remember_me"
                           type="checkbox" /></td>
            </tr>
            <tr>
                <td colspan="2" align="center"><input type="submit" value="登录"/>
                    <input type="reset" value="重置"/></td>
            </tr>
        </table>
    </form>
    </body>
    </html>

    hotelList.jsp

    <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <%@taglib prefix="security"
              uri="http://www.springframework.org/security/tags" %>
    <%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
    <%@ page contentType="text/html;charset=utf-8" pageEncoding="utf-8" %>
    <%@ include file="/WEB-INF/views/public/initVariables.jsp" %>
    <html>
    <head>
        <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
        <title>酒店列表</title>
    </head>
    <body>
    <%-- security:authentication 用户获取登录时SpringSecurity存在session中的值 --%>
    <%-- 包括当前用户名,及其权限列表 --%>
    <h2>欢迎! <security:authentication property="name"/></h2>
    <security:authentication property="authorities" var="authorities"/>
    
    <ul>
        <c:forEach items="${authorities}" var="authority">
            <li>${authority.authority}</li>
        </c:forEach>
    </ul>
    <div>
        <form action="<c:url value="/hotel/list" />" method="GET">
            <input name="code" type="text"
                   value="请输入酒店代码查询 如: shanghai"
                   style="color: gray">
            <input type="submit" value="确定">
        </form>
    </div>
    <hr/>
    <%-- 此处表示用户权限需要有roleAdmin才会加载这段JSP代码 --%>
    <security:authorize ifAllGranted="${roleAdmin}">
        <a href="<c:url value="/hotel/add" />">添加酒店</a>&nbsp
    </security:authorize>
    <a href="<c:url value="/j_spring_security_logout" />">登出</a>
    <br>
    <c:forEach items="${hotel_list}" var="hotel">
        <table>
            <security:authorize ifAllGranted="${roleAdmin}">
                <tr>
                    <td>ID</td>
                    <td>${hotel.id}</td>
                </tr>
            </security:authorize>
            <tr>
                <td>Code</td>
                <td>${hotel.code}</td>
            </tr>
            <tr>
                <td>Name</td>
                <td>${hotel.name}</td>
            </tr>
            <tr>
                <td colspan="2"><a
                        href="<c:url value="/hotel/delete?id=${hotel.id}" />">Delete</a></td>
            </tr>
        </table>
        <hr/>
    </c:forEach>
    </body>
    </html>

    initVariables.jsp

    <%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
    <%--
      Created by IntelliJ IDEA.
      User: zhenwei.liu
      Date: 13-7-30
      Time: 下午10:56
      To change this template use File | Settings | File Templates.
    --%>
    <%-- 读取properties文件变量 --%>
    <spring:eval expression="@jspPropsHolder.getProperty('role.admin')" var="roleAdmin"/>
    <spring:eval expression="@jspPropsHolder.getProperty('role.user')" var="roleUser"/>
    <spring:eval expression="@jspPropsHolder.getProperty('role.annoymous')" var="annoymous"/>

    要实现jsp中读取properties文件变量,还需要配置

        <!-- JSP Properties Holder -->
        <util:properties id="jspPropsHolder" location="classpath:com/qunar/properties/authorities.properties" />
        <context:property-placeholder properties-ref="jspPropsHolder" />

    Security依赖

            <!-- Spring Security -->
            <dependency>
                <groupId>org.springframework.security</groupId>
                <artifactId>spring-security-core</artifactId>
                <version>3.0.5.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.security</groupId>
                <artifactId>spring-security-web</artifactId>
                <version>3.0.5.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.security</groupId>
                <artifactId>spring-security-config</artifactId>
                <version>3.0.5.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.security</groupId>
                <artifactId>spring-security-taglibs</artifactId>
                <version>3.0.5.RELEASE</version>
            </dependency>
  • 相关阅读:
    4.计算机启动过程的简单介绍 计算机启动流程 计算机BIOS作用 POST 开机自检 计算机启动顺序 分区表 操作系统启动
    3.操作系统简单介绍 操作系统发展历史 批处理分时系统 操作系统是什么 操作系统对文件的抽象 进程 虚拟内存是什么 操作系统作用 操作系统功能
    2.计算机组成-数字逻辑电路 门电路与半加器 异或运算半加器 全加器组成 全加器结构 反馈电路 振荡器 存储 D T 触发器 循环移位 计数器 寄存器 传输门电路 译码器 晶体管 sram rom 微处理 计算机
    1.计算机发展阶段 计算机发展历史 机械式计算机 机电式计算机 电子计算机 逻辑电路与计算机 二极管 电子管 晶体管 硅 门电路 计算机 电磁学计算机二进制
    如何解决svn清理失败 不能更新 cleanup失败 cleanup乱码 更新乱码 svn更新提示清理 清理乱码不能清理 svn故障修复SVN cleanup 陷入死循环 svn cleanup时遇到错误怎么办
    eclipse svn插件卸载 重新安装 Subclipse卸载安装 The project was not built since its build path is incomplete This client is too old to work with the working copy at
    java for循环里面执行sql语句操作,有效结果只有一次,只执行了一次sql mybatis 循环执行update生效一次 实际只执行一次
    windows资源管理器多标签打开 windows文件夹多标签浏览 浏览器tab页面一样浏览文件夹 clover win8 win10 报错 无响应问题怎么解决 clover卡死 clover怎么换皮肤
    批处理启动vm虚拟机服务 vm12启动无界面启动vm虚拟机系统 windows上如何操作服务 sc net启动关闭服务
    不能ssh连接ubuntu linux 服务器 secureCRT不能ssh连接服务器 不能远程ssh连接虚拟机的ubuntu linux
  • 原文地址:https://www.cnblogs.com/zemliu/p/3227207.html
Copyright © 2011-2022 走看看