项目初步整合shiro

2019-08-29 06:15:17  卢浮宫  阅读量:115  版权声明:本文为站长原创文章,转载请写明出处


一、最近在做权限部分的模块所以随带把自己的项目整合shior,这里记录下

    这里是在引用时做的案例,制作了登录部分,持续集成shiro其他功能中(盐策略、角色、授权、缓存...)

    流程如下:

    ①首先调用 Subject.login(token) 进行登录,其会自动委托给 Security Manager,调用之前必须通过 SecurityUtils.setSecurityManager()设置;
    ②SecurityManager 负责真正的身份验证逻辑;它会委托给 Authenticator 进行身份验证;
    ③Authenticator 才是真正的身份验证者,Shiro API 中核心的身份认证入口点,此处可以自定义插入自己的实现;
    ④Authenticator 可能会委托给相应的 AuthenticationStrategy 进行多 Realm 身份验证,默认 ModularRealmAuthenticator 会调用     ⑤AuthenticationStrategy 进行多 Realm 身份验证;
    ⑥Authenticator 会把相应的 token 传入 Realm,从 Realm 获取身份验证信息,如果没有返回 / 抛出异常表示身份验证失败了。此处可以配置多个         Realm,将按照相应的顺序及策略进行访问。

二、首先加入maven引用如下

       <dependency>               <groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>com.github.theborakompanioni</groupId>
<artifactId>thymeleaf-extras-shiro</artifactId>
<version>2.0.0</version>
</dependency>

三、创建shiro的配置文件shiroConfig,具体代码如下:

    /**

 * @author XA
* @date 2019/8/27
* * @time 21:58
* @desc:
*/
@Configuration
public class ShiroConfig {

@Autowired
private UserService userService;

/**
* 创建ShiroFilterFactoryBean
* shiro过滤bean
*/
@Bean
public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager") DefaultWebSecurityManager securityManager) {
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();

// 设置安全管理器
shiroFilterFactoryBean.setSecurityManager(securityManager);

// 添加Shiro内置过滤器
/**
* Shiro内置过滤器,可以实现权限相关的拦截器
* 常用的过滤器:
* anon: 无需认证(登录)可以访问
* authc: 必须认证才可以访问
* user: 如果使用rememberMe功能可以直接访问
* perms: 该资源必须得到资源权限才可以访问
* role: 该资源必须得到角色权限才可以访问
*/

Map<String, String> filerMap = new LinkedHashMap<>(); //顺序的map
//配置记住我或认证通过可以访问的地址
filerMap.put("/testThymeleaf", "user");
//如果没有拦截,默认会跳转到login.jsp,可以通过setLoginUrl设置登录页面
//filerMap.put("/add","authc");
//filerMap.put("/update","authc");
filerMap.put("/testThymeleaf", "anon");
filerMap.put("/login", "anon");
//授权过滤器
filerMap.put("/*", "anon");
//设置登录的页面,发送toLogin请求
shiroFilterFactoryBean.setLoginUrl("/login");
//设置未授权的页面
shiroFilterFactoryBean.setUnauthorizedUrl("/xaxaxaxa");
//设置过滤器
shiroFilterFactoryBean.setFilterChainDefinitionMap(filerMap);
return shiroFilterFactoryBean;
}

/**
* 创建DefaultWebSecurityManager
*/
@Bean(name = "securityManager")
public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm) {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
// 关联realm
securityManager.setRealm(userRealm);
securityManager.setRememberMeManager(rememberMeManager());
return securityManager;
}

/**
* 创建Realm
*/
@Bean(name = "userRealm")
public UserRealm getRealm() {
return new UserRealm();
}

/**
* 配置ShiroDialect,用于thymeleaf和shiro标签配合使用
*/
@Bean
public ShiroDialect getShiroDialect() {
return new ShiroDialect();
}

/**
* 2 * cookie对象;
* 3 * rememberMeCookie()方法是设置Cookie的生成模版,比如cookie的name,cookie的有效时间等等。
* 4 * @return
* 5
*/
@Bean
public SimpleCookie rememberMeCookie() {
//System.out.println("ShiroConfiguration.rememberMeCookie()");
//这个参数是cookie的名称,对应前端的checkbox的name = rememberMe
SimpleCookie simpleCookie = new SimpleCookie("rememberMe");
//<!-- 记住我cookie生效时间30天 ,单位秒;-->
simpleCookie.setMaxAge(259200);
return simpleCookie;
}

/**
* cookie管理对象;
* rememberMeManager()方法是生成rememberMe管理器,而且要将这个rememberMe管理器设置到securityManager中
*
* @return
*/
@Bean
public CookieRememberMeManager rememberMeManager() {
//System.out.println("ShiroConfiguration.rememberMeManager()");
CookieRememberMeManager cookieRememberMeManager = new CookieRememberMeManager();
cookieRememberMeManager.setCookie(rememberMeCookie());
//rememberMe cookie加密的密钥 建议每个项目都不一样 默认AES算法 密钥长度(128 256 512 位)
cookieRememberMeManager.setCipherKey(Base64.decode("2AvVhdsgUs0FSA3SDFAdag=="));
return cookieRememberMeManager;
}
}

四、userRealm用以用户角色权限控制,如下:

/**
* @author XA
* @date 2019/8/27
* * @time 21:58
* @desc:
*/
@Configuration
public class ShiroConfig {

@Autowired
private UserService userService;

/**
* 创建ShiroFilterFactoryBean
* shiro过滤bean
*/
@Bean
public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager") DefaultWebSecurityManager securityManager) {
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();

// 设置安全管理器
shiroFilterFactoryBean.setSecurityManager(securityManager);

// 添加Shiro内置过滤器
/**
* Shiro内置过滤器,可以实现权限相关的拦截器
* 常用的过滤器:
* anon: 无需认证(登录)可以访问
* authc: 必须认证才可以访问
* user: 如果使用rememberMe功能可以直接访问
* perms: 该资源必须得到资源权限才可以访问
* role: 该资源必须得到角色权限才可以访问
*/

Map<String, String> filerMap = new LinkedHashMap<>(); //顺序的map
//配置记住我或认证通过可以访问的地址
filerMap.put("/testThymeleaf", "user");
//如果没有拦截,默认会跳转到login.jsp,可以通过setLoginUrl设置登录页面
//filerMap.put("/add","authc");
//filerMap.put("/update","authc");
filerMap.put("/testThymeleaf", "anon");
filerMap.put("/login", "anon");

//授权过滤器
filerMap.put("/*", "anon");


//设置登录的页面,发送toLogin请求
shiroFilterFactoryBean.setLoginUrl("/login");

//设置未授权的页面
shiroFilterFactoryBean.setUnauthorizedUrl("/xa");
//设置过滤器
shiroFilterFactoryBean.setFilterChainDefinitionMap(filerMap);
return shiroFilterFactoryBean;
}

/**
* 创建DefaultWebSecurityManager
*/
@Bean(name = "securityManager")
public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm) {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
// 关联realm
securityManager.setRealm(userRealm);
securityManager.setRememberMeManager(rememberMeManager());
return securityManager;
}

/**
* 创建Realm
*/
@Bean(name = "userRealm")
public UserRealm getRealm() {
return new UserRealm();
}

/**
* 配置ShiroDialect,用于thymeleaf和shiro标签配合使用
*/
@Bean
public ShiroDialect getShiroDialect() {
return new ShiroDialect();
}

/**
* 2 * cookie对象;
* 3 * rememberMeCookie()方法是设置Cookie的生成模版,比如cookie的name,cookie的有效时间等等。
* 4 * @return
* 5
*/
@Bean
public SimpleCookie rememberMeCookie() {
//System.out.println("ShiroConfiguration.rememberMeCookie()");
//这个参数是cookie的名称,对应前端的checkbox的name = rememberMe
SimpleCookie simpleCookie = new SimpleCookie("rememberMe");
//<!-- 记住我cookie生效时间30天 ,单位秒;-->
simpleCookie.setMaxAge(259200);
return simpleCookie;
}

/**
* cookie管理对象;
* rememberMeManager()方法是生成rememberMe管理器,而且要将这个rememberMe管理器设置到securityManager中
*
* @return
*/
@Bean
public CookieRememberMeManager rememberMeManager() {
//System.out.println("ShiroConfiguration.rememberMeManager()");
CookieRememberMeManager cookieRememberMeManager = new CookieRememberMeManager();
cookieRememberMeManager.setCookie(rememberMeCookie());
//rememberMe cookie加密的密钥 建议每个项目都不一样 默认AES算法 密钥长度(128 256 512 位)
cookieRememberMeManager.setCipherKey(Base64.decode("2AvVhdsgUs0FSA3SDFAdag=="));
return cookieRememberMeManager;
}
}

五、在登录控制类中做简单控制如下

@RequestMapping("/xalogin")
public JSONObject userSec(@RequestBody User user){
JSONObject jsonObject = new JSONObject();
//1、获取subject
Subject subject = SecurityUtils.getSubject();
//2、封装用户数据
UsernamePasswordToken token = new UsernamePasswordToken(user.getUserNo(),user.getPassword(),true);
//3、执行登录方法
try {
//交给Realm处理--->执行它的认证方法
subject.login(token);
//登录成功
jsonObject.put("data","success");
}catch (UnknownAccountException e){
//登录失败:用户名不存在
jsonObject.put("data","fail");
}catch (IncorrectCredentialsException e){
//登录失败:密码错误
jsonObject.put("data","fail");
}


最新评论: