• Spring Secutrity入门教程


    一.简介

    Spring Security是 Spring提供的安全认证服务的框架(当然还有shiro框架也能实现)。 使用Spring Security可以帮助我们来简化认证 和授权的过程。

    官网:https://spring.io/projects/spring-security

    二.使用前需要准备的步骤

    1.导入jar包,这里介绍的是maven仓库依赖jar

     2.配置web.xml文件

    <web-app>
    <display-name>Archetype Created Web Application</display-name>
    <filter>
    <!--
    DelegatingFilterProxy用于整合第三方框架
    整合Spring Security时过滤器的名称必须为springSecurityFilterChain,
    否则会抛出NoSuchBeanDefinitionException异常
    -->
    <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>
    <servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!-- 指定加载的配置文件 ,通过参数contextConfigLocation加载 -->
    <init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring-security.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>*.do</url-pattern>
    </servlet-mapping>
    </web-app>
    3.配置spring-security.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:security="http://www.springframework.org/schema/security"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc.xsd
    http://code.alibabatech.com/schema/dubbo
    http://code.alibabatech.com/schema/dubbo/dubbo.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd
    http://www.springframework.org/schema/security
    http://www.springframework.org/schema/security/spring-security.xsd">

    <!--配置哪些资源匿名可以访问(不登录也可以访问)-->
    <!--<security:http security="none" pattern="/pages/a.html"></security:http>
    <security:http security="none" pattern="/pages/b.html"></security:http>-->
    <!--<security:http security="none" pattern="/pages/**"></security:http>-->
    <security:http security="none" pattern="/login.html"></security:http>
    <!--
    auto-config:自动配置,如果设置为true,表示自动应用一些默认配置,比如框架会提供一个默认的登录页面
    use-expressions:是否使用spring security提供的表达式来描述权限
    -->
    <security:http auto-config="true" use-expressions="true">
    <!--配置拦截规则,/** 表示拦截所有请求-->
    <!--
    pattern:描述拦截规则
    asscess:指定所需的访问角色或者访问权限
    -->
    <!--只要认证通过就可以访问-->
    <security:intercept-url pattern="/pages/a.html" access="isAuthenticated()" />

    <!--拥有add权限就可以访问b.html页面-->
    <security:intercept-url pattern="/pages/b.html" access="hasAuthority('add')" />

    <!--拥有ROLE_ADMIN角色就可以访问c.html页面-->
    <security:intercept-url pattern="/pages/c.html" access="hasRole('ROLE_ADMIN')" />

    <!--拥有ROLE_ADMIN角色就可以访问d.html页面,
    注意:此处虽然写的是ADMIN角色,框架会自动加上前缀ROLE_-->
    <security:intercept-url pattern="/pages/d.html" access="hasRole('ADMIN')" />
    <security:intercept-url pattern="/**" access="hasRole('ROLE_ADMIN')"></security:intercept-url>

    <!--如果我们要使用自己指定的页面作为登录页面,必须配置登录表单.页面提交的登录表单请求是由框架负责处理-->
    <!--
    login-page:指定登录页面访问URL
    -->
    <security:form-login
    login-page="/login.html"
    username-parameter="username"
    password-parameter="password"
    login-processing-url="/login.do"
    default-target-url="/index.html"
    authentication-failure-url="/login.html"></security:form-login>

    <!--
    csrf:对应CsrfFilter过滤器
    disabled:是否启用CsrfFilter过滤器,如果使用自定义登录页面需要关闭此项,否则登录操作会被禁用(403)
    -->
    <security:csrf disabled="true"></security:csrf>

    <!--
    logout:退出登录
    logout-url:退出登录操作对应的请求路径
    logout-success-url:退出登录后的跳转页面
    -->
    <security:logout logout-url="/logout.do"
    logout-success-url="/login.html" invalidate-session="true"/>

    </security:http>

    <!--配置认证管理器-->
    <security:authentication-manager>
    <!--配置认证提供者-->
    <security:authentication-provider user-service-ref="userService2">
    <!--
    配置一个具体的用户,后期需要从数据库查询用户
    <security:user-service>
    <security:user name="admin" password=" 1234" authorities="ROLE_ADMIN"/>
    </security:user-service>
    -->
    <!--指定度密码进行加密的对象-->
    <security:password-encoder ref="passwordEncoder"></security:password-encoder>
    </security:authentication-provider>
    </security:authentication-manager>

    <bean id="userService" class="com.hy.service.SpringSecurityUserService"></bean>
    <bean id="userService2" class="com.hy.service.SpringSecurityUserService2"></bean>
    <!--配置密码加密对象-->
    <bean id="passwordEncoder"
    class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder" />

    <!--开启spring注解使用-->
    <context:annotation-config></context:annotation-config>

    <!--开启springmvc注解的支持-->
    <mvc:annotation-driven></mvc:annotation-driven>
    <context:component-scan base-package="com.hy.controller"></context:component-scan>

    <!--开启注解方式权限控制-->
    <security:global-method-security pre-post-annotations="enabled" />
    <!--使用前端控制器/时需要配置以下 https://www.cnblogs.com/dreampig/p/9001772.html-->
    <!--<mvc:default-servlet-handler/>-->
    <!--<mvc:view-controller path="/" view-name="redirect:/login.html"/>-->
    <!--静态资源映射-->
    <!--<mvc:resources mapping="" location="" cache-period="31536000"/>-->

    </beans>
    到了这里,根据以上的注解,基本就能理解spring-secutriy配置文件的基本配置
    权限和角色的校验拦截有配置方式也有注解方式(这里介绍一种注解@PreAuthorize("hasAuthority('add')"),其余的可百度)
    如果我们要从数据库动态查询用户信息,就必须按照spring security框架的要求提供一个实现 UserDetailsService接口的实现类,并按照框架的要求进行配置即可。
    框架会自动调用实现类中的方法 并自动进行密码校验。
    public class SpringSecurityUserService implements UserDetailsService {
    //模拟数据库中的用户数据
    public static Map<String, User> map = new HashMap<>();
    static {
    com.hy.pojo.User user1 = new com.hy.pojo.User();
    user1.setUsername("admin");
    user1.setPassword("admin");//明文密码(没有加密)

    com.hy.pojo.User user2 = new com.hy.pojo.User();
    user2.setUsername("xiaoming");
    user2.setPassword("1234");

    map.put(user1.getUsername(),user1);
    map.put(user2.getUsername(),user2);
    }

    //根据用户名查询用户信息
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
    System.out.println("用户输入的用户名为:" + username);
    //根据用户名查询数据库获得用户信息(包含数据库中存储的密码信息)
    User user = map.get(username);//模拟查询根据用户名查询数据库
    if(user == null){
    //用户名不存在
    return null;
    }else{
    //将用户信息返回给框架
    //框架会进行密码比对(页面提交的密码和数据库中查询的密码进行比对)
    List<GrantedAuthority> list = new ArrayList<>();
    //为当前登录用户授权,后期需要改为从数据库查询当前用户对应的权限
    list.add(new SimpleGrantedAuthority("permission_A"));//授权
    list.add(new SimpleGrantedAuthority("permission_B"));

    if(username.equals("admin")){
    list.add(new SimpleGrantedAuthority("ROLE_ADMIN"));//授予角色
    }
    org.springframework.security.core.userdetails.User securityUser = new org.springframework.security.core.userdetails.User(username,"{noop}"+user.getPassword(),list);
    return securityUser;
    }
    }




  • 相关阅读:
    题解 CF1361B Johnny and Grandmaster
    题解 AT2582 [ARC075D] Mirrored
    题解 P2081 [NOI2012] 迷失游乐园
    第八课:人人站模板开发(获取产品分类信息标签)
    第十二课:人人站模板开发(links 标签获取友情链接列表)
    第七课:人人站模板开发(menus 获取导航菜单标签学习)
    第十课:人人站模板开发(nodes标签获取栏目列表)
    第十五课:人人站后台安装后忘记后台登录地址情况
    第九课:人人站模板开发(goods标签获取产品数据列表)
    第十一课:人人站模板开发(articles 获取文章列表)
  • 原文地址:https://www.cnblogs.com/HYV587/p/12654523.html
Copyright © 2020-2023  润新知