zoukankan      html  css  js  c++  java
  • 关于----身份验证--shiro

    Shiro框架简单介绍
    Apache Shiro是Java的一个安全框架,旨在简化身份验证和授权。Shiro在JavaSE和JavaEE项目中都可以使用。它主要用来处理身份认证,授权,企业会话管理和加密等。Shiro的具体功能点如下:
    (1)身份认证/登录,验证用户是不是拥有相应的身份;
    (2)授权,即权限验证,验证某个已认证的用户是否拥有某个权限;即判断用户是否能做事情,常见的如:验证某个用户是否拥有某个角色。或者细粒度的验证某个用户对某个资源是否具有某个权限;
    (3)会话管理,即用户登录后就是一次会话,在没有退出之前,它的所有信息都在会话中;会话可以是普通JavaSE 环境的,也可以是如Web环境的;
    (4)加密,保护数据的安全性,如密码加密存储到数据库,而不是明文存储;
    (5)Web支持,可以非常容易的集成到Web环境;
    Caching:缓存,比如用户登录后,其用户信息、拥有的角色/权限不必每次去查,这样可以提高效率;
    (6)shiro支持多线程应用的并发验证,即如在一个线程中开启另一个线程,能把权限自动传播过去;
    (7)提供测试支持;
    (8)允许一个用户假装为另一个用户(如果他们允许)的身份进行访问;
    (9)记住我,这个是非常常见的功能,即一次登录后,下次再来的话不用登录

    jar包

    <!-- shiro所需架包 -->
    <dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-spring</artifactId>
    <version>1.4.0</version>
    </dependency>

    创建shiro类

    package com.hyxy.utils;
    import javax.annotation.Resource;
    import org.apache.shiro.authc.AuthenticationException;
    import org.apache.shiro.authc.AuthenticationInfo;
    import org.apache.shiro.authc.AuthenticationToken;
    import org.apache.shiro.authc.SimpleAuthenticationInfo;
    import org.apache.shiro.authz.AuthorizationInfo;
    import org.apache.shiro.authz.SimpleAuthorizationInfo;
    import org.apache.shiro.realm.AuthorizingRealm;
    import org.apache.shiro.subject.PrincipalCollection;
    import com.hyxy.entity.User;
    import com.hyxy.service.LoginService;

    public class MyRealm extends AuthorizingRealm {

    @Resource
    private LoginService LoginService;
    /**
    * 用户登录验证
    */
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
    // token封装了用户登录信息
    // 获取用户名
    String username = (String) token.getPrincipal();
    // 跟据用户名查询用户信息
    User user = LoginService.getByUserName(username);
    if (user != null) {
    // 从数据库获取到用户名和密码,会和提交的用户名密码进行比较,不匹配会报错
    AuthenticationInfo authcInfo = new SimpleAuthenticationInfo(user.getUsername(), user.getPassword(), "");
    return authcInfo;
    } else {
    return null;
    }
    }
    /**
    * 为登录的用户授予角色和权限
    */
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
    // 获取用户名
    String userName = (String) principals.getPrimaryPrincipal();
    // 获取到当前登录用户的认证信息
    SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
    // // 给用户授权角色
    // authorizationInfo.setRoles(userService.getRoles(userName));
    // // 给用户授权权限
    // authorizationInfo.setStringPermissions(userService.getPermissions(userName));
    // return authorizationInfo;
    return null;
    }
    }

    配置类

    package com.hyxy.config;

    import java.util.LinkedHashMap;
    import java.util.Map;
    import org.apache.shiro.mgt.SecurityManager;
    import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
    import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;

    import com.hyxy.utils.MyRealm;

    /**
    * 使用java配置,配置shiro类
    */
    @Configuration
    public class ShiroConfig {

    @Bean
    public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {
    //加载管理器
    ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
    shiroFilterFactoryBean.setSecurityManager(securityManager);

    //未登录跳转到的页面或url,如果不设置默认会自动寻找Web工程根目录下的"/login.jsp"页面
    // shiroFilterFactoryBean.setLoginUrl("/login.jsp");
    //未授权跳转到的页面或url
    // shiroFilterFactoryBean.setUnauthorizedUrl("/unauthor.jsp");

    // 添加shiro内置过滤器
    Map<String, String> map = new LinkedHashMap<String, String>();
    // 配置不需要验证过滤器
    map.put("/", "anon");
    map.put("/LoginController/login", "anon");
    map.put("/css/**", "anon");
    map.put("/js/**", "anon");
    map.put("/img/**", "anon");
    map.put("/font/**", "anon");
    map.put("/images/**", "anon");

    // 需要登录验证的过滤器
    // map.put("/admin", "authc");

    // 角色授权过滤器,必须拥有该角色才能访问,多个参数时写 roles["admin,user"]
    /* map.put("/student", "roles[teacher]");

    // 权限授权过滤器,必须拥有该权限,才能访问
    map.put("/teacher", "perms[student:create]");*/

    //主要这行代码必须放在所有权限设置的最后,不然会导致所有 url 都被拦截
    // 保证除定义url外的所有url都必须是已登录的
    map.put("/**", "user");

    shiroFilterFactoryBean.setFilterChainDefinitionMap(map);
    return shiroFilterFactoryBean;
    }

    /**
    * 注入 securityManager
    */
    @Bean
    public SecurityManager securityManager() {
    DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
    // 设置自定义realm,不能直接 new必须要使用 @Bean 注入 MyRealm,
    securityManager.setRealm(myRealm());
    return securityManager;
    }

    /**
    * 自定义身份认证realm;
    * (这个需要自己写,账号密码校验;权限等)
    */
    @Bean
    public MyRealm myRealm() {
    MyRealm myRealm = new MyRealm();
    return myRealm;
    }

    }

  • 相关阅读:
    easyui-tabs扩展根据自定义属性打开页签
    nhibernate 3.x新特性
    c# dynamic的属性是个变量
    草稿
    好番记录
    今日内容
    PHP Filter
    PHP Filesystem
    PHP Directory 函数
    PHP Date/Time 函数
  • 原文地址:https://www.cnblogs.com/yangfanfan/p/11455628.html
Copyright © 2011-2022 走看看