码迷,mamicode.com
首页 > 编程语言 > 详细

spring security初识

时间:2021-06-02 20:05:26      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:beans   结果   列表   encoding   imp   word   location   one   app   

初识spring security

1.spring security是什么?

spring security 是spring家族中一个安全管理框架。

2.spring security的作用是什么?

  1. 用户认证:你是谁?不是我们的用户还想登录?
  2. 授权:你的角色是什么?不同的角色对应不同的权限。哦,是总裁啊,我们所有的接口您都可以访问!
  3. 攻击防护:防止伪造身份。e...这个...目前还不懂

3.spring security如何使用?

1.pom文件引入依赖

<!--springSecurity依赖开始-->
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-web</artifactId>
            <version>5.0.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-config</artifactId>
            <version>5.0.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-core</artifactId>
            <version>5.0.1.RELEASE</version>
        </dependency>

        <!--用于页面端权限控制-->
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-taglibs</artifactId>
            <version>5.0.1.RELEASE</version>
        </dependency>
        <!--springSecurity依赖结束-->

2.web.xml文件中配置DelegatingFilterProxy

<!--配置springSecurity验证登录-->
  <filter>
    <!--名称必须为springSecurityFilterChain,不可改变-->
    <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>

3.编写spring-security.xml文件,用于配置具体的拦截规则

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:security="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.xsd">
    
    <!-- 配置不拦截的资源 -->
    <security:http pattern="/login.jsp" security="none"/>
    <security:http pattern="/failer.jsp" security="none"/>
    <security:http pattern="/css/**" security="none"/>
    <security:http pattern="/img/**" security="none"/>
    <security:http pattern="/plugins/**" security="none"/>

    <!--方法权限控制,有两种方式:jsr250和secured-->
    <!--以下两种方式任选一种即可-->
    <!--配置jsr250进行方法权限控制-->
    <!--<security:global-method-security jsr250-annotations="enabled"/>-->

    <!--配置secured方式进行方法权限控制-->
    <security:global-method-security secured-annotations="enabled"/>

    <!-- 
        配置具体的规则 
        auto-config="true"    不用自己编写登录的页面,框架提供默认登录页面
        use-expressions="false"    是否使用SPEL表达式(没学习过)
            如不使用 false:则 access="ROLE_root,ROLE_user,ROLE_admin" 即可
            若要使用 true:则 access= "hasAnyRole(‘ROLE_root,ROLE_user,ROLE_admin‘)"
    -->
    <security:http auto-config="true" use-expressions="true">
        <!-- 配置具体的拦截的规则 pattern="请求路径的规则" access="访问系统的人,必须有hasAnyRole指定的角色" -->
        <security:intercept-url pattern="/**" access="hasAnyRole(‘ROLE_root,ROLE_user,ROLE_admin‘)"/>
        
        <!-- 定义跳转的具体的页面
            login-page="/login.jsp"    登录页面
            login-processing-url="/login.do"  登录路径
            default-target-url="/index.jsp"
            authentication-failure-url="/failer.jsp"  登录失败跳转页面
            authentication-success-forward-url="/pages/main.jsp"  登录成功跳转页面
        -->
        <security:form-login  
            login-page="/login.jsp"
            login-processing-url="/login.do"
            default-target-url="/index.jsp"
            authentication-failure-url="/failer.jsp"
            authentication-success-forward-url="/pages/main.jsp"
        />
        
        <!-- 关闭跨域请求 -->
        <security:csrf disabled="true"/>
        
        <!-- 退出 -->
        <!--在springSecurity中,要退出登录只需配置退出路径即可,然后在点击退出按钮时,指定此路径。logout-success-url="/login.jsp"用于指定退出后跳转的页面-->
        <security:logout invalidate-session="true" logout-url="/logout.do" logout-success-url="/login.jsp" />
        
    </security:http>
    
    <!-- 切换成数据库中的用户名和密码 -->
    <security:authentication-manager>
        <!--userService是我们自己添加的bean-->
        <security:authentication-provider user-service-ref="userService">
            <!-- 配置加密的方式 -->
            <security:password-encoder ref="passwordEncoder"/>
        </security:authentication-provider>
    </security:authentication-manager>
    
    <!-- 配置加密类 -->
    <bean id="passwordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/>
    
    <!-- 提供了入门的方式,在内存中存入用户名和密码 
    <security:authentication-manager>
        <security:authentication-provider>
            <security:user-service>
                <security:user name="admin" password="{noop}admin" authorities="ROLE_USER"/>
            </security:user-service>
        </security:authentication-provider>
    </security:authentication-manager>
    -->    
 </beans>   

4.编写userService

    /**
     * 判断当前用户是否可以登录
     * @param username
     * @return
     * @throws UsernameNotFoundException
     */
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        UserInfo userInfo = userDao.findByUsername(username);
        //我们获取到的类型是UserInfo,而返回值却是UserDetails类型,怎么办呢?
        //将我们的对象封装成UserDetails,
        //这个User是Security提供的,此User实现了UserDetails接口
        //userInfo.getStatus()==0时,角色状态为关闭,则不可访问(详情查看users表)
        /**
         * 用户登录必需信息
         * 1.用户名和密码是否正确(即user表中是否存在)
         * 2.用户状态是否开启(即user表中该用户的status字段是否为1,若未开启则无法登录)
         * 3.用户是否有权限(即在users_role表中是否有此用户和角色的对应关系)
         *      若用户没有权限,虽然可以登录,但是无法查看任何数据(页面报403)
         * 4.getAuthority(userInfo.getRoles())得到的结果为当前用户拥有的角色,只有spring-security.xml文件中指定的角色有访问权限
         */
        User user = new User(userInfo.getUsername(), userInfo.getPassword(), userInfo.getStatus()==0? false:true,true,true,true,getAuthority(userInfo.getRoles()));
        return user;
    }

    /**
     * 用于获取用户的权限信息
     * @param roles  当前用户的权限列表
     * @return
     */
    public List<SimpleGrantedAuthority> getAuthority(List<Role> roles){
        List<SimpleGrantedAuthority> list = new ArrayList<>();
        for(Role role : roles){
            //为什么拼接"ROLE_"?因为spring-security.xml中配置的格式就是这样,强制的,好像可以去掉,但目前还不会。。。
            list.add(new SimpleGrantedAuthority("ROLE_"+ role.getRoleName()));
        }
        return list;
    }

5.此外,我们上面也已经配置了控制器方法访问控制,如下,只有通过@Secured指定的角色可以访问该方法

@Secured({"ROLE_admin","ROLE_user"})
    @RequestMapping("findAll.do")
    public ModelAndView findAll(){
        ModelAndView mv = new ModelAndView();
        List<Role> roleList = roleService.findAll();
        mv.addObject("roleList",roleList);
        mv.setViewName("role-list");
        return mv;
    }

至此,所有的接口访问都会先跳转到我们的登录页面啦

技术图片

 

spring security初识

标签:beans   结果   列表   encoding   imp   word   location   one   app   

原文地址:https://www.cnblogs.com/jesus-chen/p/14837219.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!