spring-security用户权限认证框架

大家知道在spring中有一个基于acegi开发的spring-security的权限管理模块,它是一个轻量级框架。 SpringSecurity能以声明的方式来保护Web应用程序的URL访问,只需简单的配置即可实现。SpringSecurity通过一系列Servlet过滤器为Web应用程序提供了多种安全服务。
      配置spring-security
     在web.xml中添加过滤器:

<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>

然后在<classpath>路径下创建配置文件PROJECT-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-2.0.xsd
                        http://www.springframework.org/schema/security
                        http://www.springframework.org/schema/security/spring-security-2.0.xsd">

    <http auto-config="true" access-denied-page="/access_denied.jsp">
        <intercept-url pattern="/admin/**" access="ROLE_ADMIN" />
        <intercept-url pattern="/user/**" access="ROLE_USER" />

        <form-login login-page="/login.htm" authentication-failure-url="/login.htm?error=1" default-target-url="/" />
        <remember-me data-source-ref="dataSource" />
        <logout invalidate-session="true" logout-success-url="/" />
        <!--
        Uncomment to enable X509 client authentication support
        <x509 />
          -->
    </http>

    <authentication-provider>
        <!--
        <password-encoder hash="md5" />
          -->
        <jdbc-user-service data-source-ref="dataSource"
            users-by-username-query="select account as username, password, status as enabled from user where account=?"
            authorities-by-username-query="select account as username, authority from user where account=?" />
    </authentication-provider>
</beans:beans>

同时将该配置文件加到web.xml的 <context-param> 里。

spring-security中使用角色来分类管理用户权限,如上面的配置中就包含了ROLE_ADMIN和ROLE_USER两个角色,并分别有/admin/和/user/的URL路径下的权限。

在数据库中保存用户

用户的帐号密码有几种不同的方式保存,包括xml中、LDAP和数据库中等。上面使用的是保存到数据库中的方式,使用了之前在applicationContext.xml中配置的dataSource bean。使用数据库保存帐号时,需要按照spring-security规定的字段来建表,有两个相关的表,分别用于保存帐号密码和登录状态。使用MySQL可以这样创建:

CREATE TABLE `user` (
  `account` varchar(50) NOT NULL,
  `password` varchar(50) NOT NULL,
  `authority` varchar(50) NOT NULL,
  `status` tinyint(1) NOT NULL,
  UNIQUE KEY `account` (`account`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `persistent_logins` (
  `username` varchar(64) NOT NULL,
  `series` varchar(64) NOT NULL,
  `token` varchar(64) NOT NULL,
  `last_used` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`series`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

加密密码

默认spring-security中采用明文方式存储密码,可以通过设置 <password-encoder> 来对密码加密。这时对应的用户注册模块也要将密码以加密后的数据保存到数据库中才行。

import org.springframework.security.providers.encoding.Md5PasswordEncoder;
import org.springframework.security.providers.encoding.PasswordEncoder;

PasswordEncoder encoder = new Md5PasswordEncoder();
String password = encoder.encodePassword(form.getPassword(), null);

阻止用户重复登陆

可以通过会话控制来防止用户重复登录,这可以通过配置来实现。首先在web.xml中添加监听:

<listener>
    <listener-class>org.springframework.security.ui.session.HttpSessionEventPublisher</listener-class>
</listener>

然后在PROJECT-security.xml配置文件中的 <http></http> 内添加:

<concurrent-session-control max-sessions="1" exception-if-maximum-exceeded="true" />

max-sessions="1" 表示该用户同时登录的最大会话数为1, exception-if-maximum-exceeded="true" 表示阻止超出的用户登录。

在jsp中加入spring-security

spring-security给出了在jsp中使用的接口。用户登录可以使用下面的表单:

<form name=‘f‘ action=‘/PROJECT/j_spring_security_check‘ method=‘POST‘>
<table>
  <tr><td>用户名:</td><td><input type=‘text‘ name=‘j_username‘ value=‘‘></td></tr>
  <tr><td>密码:</td><td><input type=‘password‘ name=‘j_password‘/></td></tr>
  <tr><td></td><td><input type=‘checkbox‘ name=‘_spring_security_remember_me‘/> 自动登录</td></tr>
  <tr><td colspan=‘2‘ align="right"><input name="reset" id="reset" type="reset" value="重置" /> <input name="submit" id="submit" type="submit" value="登录" /></td></tr>
</table>
</form>

根据登录用户进行条件判断可以使用下面的方式:

<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>

<sec:authorize ifAllGranted="ROLE_ANONYMOUS">
<!-- ... -->
</sec:authorize>
<sec:authorize ifAllGranted="ROLE_USER">
<!-- ... -->
</sec:authorize>

在特定jsp页面获取登录用户的帐号的方法是:

<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>

<input name="customer" type="hidden" value="<sec:authentication property=‘principal.username‘ />" />

另外, Spring Security 还提供了如下一些功能:

1.       remember me ,记住我;

2.       form-login 登录控制;

3.       多种身份认证功能;

4.       用户密码加密和“ salt ”功能;

5.       http 协议控制;

6.       访问端口控制;

7.       Pre-Invocation & After-Invocation 。

spring-security还有很多相关的用法,可以查看 官方的文档 。 http://www.yeolar.com/note/2011/10/19/spring-security/

时间: 2024-10-08 13:16:19

spring-security用户权限认证框架的相关文章

Spring MVC、Mybatis、Hibernate、Bootstrap、HTML5、jQuery、Spring Security安全权限、Lucene全文检索、Ehcache分布式缓存 、高性能、高并发【Java企业通用开发平台框架】

功能特点: 1.适配所有设备(PC.平板.手机等),兼容所有浏览器(Chrome.Firefox.Opera.Safari.IE6~IE11等),适用所有项目(MIS管理信息系统.OA办公系统.ERP企业资源规划系统.CRM客户关系管理系统.网站.管理后台等). 2.快速开发,敏捷的数据持久层解决方案. 2.1.事务自动处理. 2.2.O/R Mapping基于注解,零配置XML,便于维护,学习成本低. 2.3.接口和实现分离,不需写数据持久层代码,只需写接口,自动生成添加.修改.删除.排序.分

使用Spring Security实现权限管理

使用Spring Security实现权限管理 1.技术目标 了解并创建Security框架所需数据表 为项目添加Spring Security框架 掌握Security框架配置 应用Security框架为项目的CRUD操作绑定权限 2.权限管理需求描述 为系统中的每个操作定义权限,如定义4个权限: 1)超级权限,可以使用所有操作 2)添加影片权限 3)修改影片权限 4)删除影片权限 为系统设置管理员帐号.密码 为系统创建权限组,每个权限组可以配置多个操作权限,如创建2个权限组: 1)"Admi

Spring Security控制权限

Spring Security控制权限 1,配置过滤器 为了在项目中使用Spring Security控制权限,首先要在web.xml中配置过滤器,这样我们就可以控制对这个项目的每个请求了. <filter>    <filter-name>springSecurityFilterChain</filter-name>    <filter-class>org.springframework.web.filter.DelegatingFilterProxy&

Spring Security 之身份认证

Spring Security可以运行在不同的身份认证环境中,当我们推荐用户使用Spring Security进行身份认证但并不推荐集成到容器管理的身份认证中时,但当你集成到自己的身份认证系统时,它依然是支持的. 1. Spring Security中的身份认证是什么? 现在让我们考虑一下每个人都熟悉的标准身份认证场景: (1)用户打算使用用户名和密码登陆系统 (2)系统验证用户名和密码合法 (3)得到用户信息的上下文(角色等信息) (4)为用户建立一个安全上下文 (5)用户接下来可能执行一些权

Spring Security 实现身份认证

Spring Security可以运行在不同的身份认证环境中,当我们推荐用户使用Spring Security进行身份认证但并不推荐集成到容器管理的身份认证中时,但当你集成到自己的身份认证系统时,它依然是支持的. 1. Spring Security中的身份认证是什么? 现在让我们考虑一下每个人都熟悉的标准身份认证场景: (1)用户打算使用用户名和密码登陆系统 (2)系统验证用户名和密码合法 (3)得到用户信息的上下文(角色等信息) (4)为用户建立一个安全上下文 (5)用户接下来可能执行一些权

Spring Security 解析(二) —— 认证过程

Spring Security 解析(二) -- 认证过程 ??在学习Spring Cloud 时,遇到了授权服务oauth 相关内容时,总是一知半解,因此决定先把Spring Security .Spring Security Oauth2 等权限.认证相关的内容.原理及设计学习并整理一遍.本系列文章就是在学习的过程中加强印象和理解所撰写的,如有侵权请告知. 项目环境: JDK1.8 Spring boot 2.x Spring Security 5.x 一.@EnableGlobalAuth

Spring Security 自定义登录认证(二)

一.前言 本篇文章将讲述Spring Security自定义登录认证校验用户名.密码,自定义密码加密方式,以及在前后端分离的情况下认证失败或成功处理返回json格式数据 温馨小提示:Spring Security中有默认的密码加密方式以及登录用户认证校验,但小编这里选择自定义是为了方便以后业务扩展,比如系统默认带一个超级管理员,当认证时识别到是超级管理员账号登录访问时给它赋予最高权限,可以访问系统所有api接口,或在登录认证成功后存入token以便用户访问系统其它接口时通过token认证用户权限

【转】Spring Security Authentication (认证)

Spring Security Authentication (认证)原理初探 Spring Security Authentication (认证)定制开发 原文地址:https://www.cnblogs.com/qiyebao/p/12218743.html

详解Spring Security进阶身份认证之UserDetailsService(附源码)

在上一篇Spring Security身份认证博文中,我们采用了配置文件的方式从数据库中读取用户进行登录.虽然该方式的灵活性相较于静态账号密码的方式灵活了许多,但是将数据库的结构暴露在明显的位置上,绝对不是一个明智的做法.本文通过Java代码实现UserDetailsService接口来实现身份认证. 1.1 UserDetailsService在身份认证中的作用 Spring Security中进行身份验证的是AuthenticationManager接口,ProviderManager是它的