关于----身份验证--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;
}

}

posted @ 2019-09-03 21:00  花喵  阅读(209)  评论(0编辑  收藏  举报