shiro安全框架用户传递更多信息的方法(用实体)
只要在认证的方法中传入bo那么以后从安全框架拿的就是bo,传的是string,安全框架拿的就是string
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package com.common.shrio;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import org.acegisecurity.userdetails.UserDetails;
import org.acegisecurity.userdetails.UserDetailsService;
import org.acegisecurity.userdetails.UsernameNotFoundException;
import org.apache.commons.lang.StringUtils;
import org.apache.shiro.SecurityUtils;
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.authc.UsernamePasswordToken;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.session.Session;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.ByteSource;
import org.springframework.beans.factory.annotation.Autowired;
/**
http://shiro.apache.org/java-authentication-guide.html
*
* Subject Security specific user 'view' of an application user. It can be a human being, a third-party process,
* a server connecting to you application application, or even a cron job. Basically, it is anything or
* anyone communicating with your application.
*
* PrincipalsA subjects identifying attributes. First name, last name, social security number, username
*
* Credentialssecret data that are used to verify identities. Passwords, Biometric data, x509 certificates,
*
* RealmsSecurity specific DAO, data access object, software component that talkts to a backend data source.
* If you have usernames and password in LDAP, then you would have an LDAP Realm that would communicate
* with LDAP. The idea is that you would use a realm per back-end data source and Shiro would know how
* to coordinate with these realms together to do what you have to do.
*
* @author fq1798
*
*/
public class ShiroDbRealm extends AuthorizingRealm {
@Autowired
private UserDetailsService userDetailsService;
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
System.out.println(" 由于加入了缓�?, 此处只会load�?次:doGetAuthorizationInfo.................");
//得到 doGetAuthenticationInfo 方法中传入的凭证,下面认证的时候传的就是实体
UserDetails shiroUser = (UserDetails) principals.fromRealm(getName()).iterator().next();
List<String> roleList = new ArrayList<String>();
List<String> permissionList = new ArrayList<String>();
String userName = shiroUser.getUsername();
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
//这个确定页面�?<shiro:hasRole>标签的name的�??
roleList.add("admin");
info.addRoles(roleList);
//这个就是页面�? <shiro:hasPermission> 标签的name的�??
permissionList.add("/flex/rbac/getSkillMenuAndSkillsForShow.action");
permissionList.add("/flex/uifrm/index.jsp");
info.addStringPermissions(permissionList);
return info;
}
/**
* AuthenticationInfo represents a Subject's (aka user's) stored account information
* relevant to the authentication/log-in process only.
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
// 获取基于用户名和密码的令牌
UsernamePasswordToken token1 = (UsernamePasswordToken) token;
UserDetails userDetails;
try {
userDetails = this.userDetailsService.loadUserByUsername(token1.getUsername());
} catch (UsernameNotFoundException notFound) {
return null;
}
try {
//这里构造函数传的是UserDetails,所以Subject currentUser = SecurityUtils.getSubject();
//UserDetailsBean shiroUser = (UserDetailsBean) currentUser.getPrincipal()拿到的是实体,如果传的是string就是string
AuthenticationInfo authcInfo = new SimpleAuthenticationInfo(
userDetails, userDetails.getPassword(),
getName());
this.setSession("currentUser", userDetails);
return authcInfo;
} catch (Exception e) {
e.printStackTrace();
}
return null;// null时会在LoginController中抛出UnknownAccountException异常
}
private void setSession(Object key, Object value) {
Subject currentUser = SecurityUtils.getSubject();
if (null != currentUser) {
Session session = currentUser.getSession();
if (null != session) {
session.setAttribute(key, value);
}
}
}
/**
* 自定义Authentication对象,使得Subject除了携带用户的登录名外还可以携带更多信息.
*/
public static class ShiroUser implements Serializable {
private static final long serialVersionUID = -1373760761780840081L;
public String loginName;
public String name;
public ShiroUser(String loginName, String name) {
this.loginName = loginName;
this.name = name;
}
public String getName() {
return name;
}
/**
* 本函数输出将作为默认�?<shiro:principal/>输出.
*/
@Override
public String toString() {
return loginName;
}
}
}
相关推荐
Apache Shiro 是一个强大且易用的Java安全框架,提供了认证、授权、加密和会话管理功能,可以非常轻松地开发出足够安全的应用。...通过学习和使用Shiro,我们可以更有效地保护我们的应用程序,确保用户数据的安全。
### 基于SSM框架的Web应用安全机制研究 #### 摘要与背景 随着互联网技术的迅速发展,Web应用已经成为企业信息化系统的重要组成...未来的研究可以进一步探索更多高级的安全机制和技术,以应对不断变化的网络安全挑战。
此外,Spring还集成了数据访问、事务管理、安全性、消息传递等多个领域,使得开发者可以方便地将各种组件整合到应用中。 **Shiro** Apache Shiro是一个轻量级的安全框架,主要用于身份认证、授权(权限控制)和会话...
6. **粗粒度权限控制**:Shiro支持基于URL的权限控制,我们可以在Controller方法上使用`@RequiresPermissions`注解,指定该方法需要的权限。这样,当用户试图访问受保护的URL时,Shiro会进行检查并决定是否允许访问...
8. **权限控制**:系统中需要实现用户角色的区分,这通常可以通过Spring Security或者Apache Shiro等安全框架实现,以确保不同用户只能访问他们被授权的功能。 9. **异常处理**:良好的异常处理机制可以确保系统在...
【标题】:“用Java的SSH框架写成的:BBS” 【内容详解】 SSH框架,全称为Spring、Struts和Hibernate,是Java开发中的一个经典组合,常用于构建企业级Web应用程序,包括像BBS这样的论坛系统。这个框架集合了Spring...
此外,安全性是此类系统的重要考虑因素,项目中可能采用了如HTTPS协议来保障数据传输的安全,以及Spring Security或Shiro等安全框架来实现用户权限控制,防止未授权访问。 总之,《列车票务信息管理系统》是一个...
6. **安全控制**:系统可能使用Spring Security或Apache Shiro进行权限控制,确保只有授权用户才能访问特定资源,例如管理员可以查看所有订单,而普通用户只能查看自己的订单。 7. **异常处理**:在Java SSM项目中...
9. **安全性**:可能会涉及到Spring Security或Shiro等安全框架的使用,实现用户的登录验证和权限控制。 10. **测试**:了解如何编写单元测试和集成测试,确保每个组件的功能正确。 通过这个项目,开发者可以深入...
以上就是SSH集成的基本步骤,实际开发中可能还会涉及到更多细节和优化,但这个流程提供了一个基本的框架集成指南。在学习和实践中,不断深入理解SSH框架各自的原理和协同工作方式,将有助于提升开发效率和代码质量。
而管理员则有更多权限,如添加、修改、删除订单,管理用户信息,监控系统运行状态等。这些功能的实现,离不开数据库的设计和优化。系统可能包含如用户表、订单表、货物表、运输状态表等多个实体表,通过合理的关系...
综上所述,基于Java MVC的管理员管理系统是一个涉及多方面技术的项目,包括Spring MVC框架的应用、数据库交互、用户认证和授权、异常处理等。学习和理解这些知识点,对于提升Java Web开发能力至关重要。通过实际项目...
8. **安全框架整合**:例如Spring Security或Apache Shiro,提供身份验证、授权和会话管理。 这些项目为学习者提供了实战经验,有助于深入理解J2EE框架的各个组成部分及其实际应用场景。通过研究这些项目,开发者...
在IT行业中,任务管理系统是企业或团队日常工作中不可或缺的一部分,它能有效提高工作效率,确保...如果需要进一步扩展,可以考虑添加更多特性,如任务分类、优先级设定、任务评论、搜索功能等,使系统更加全面和实用。
这可以通过实现Spring Security或Apache Shiro等安全框架来完成,确保只有授权用户才能访问特定的资源。 8. **测试与部署**: 开发过程中,单元测试、集成测试以及压力测试是必不可少的,可以使用JUnit、Mockito等...
7. **数据库设计**:对于一个旅游网站,数据库可能包括景点信息表、用户信息表、订单表、评论表等多个表,每张表都对应着模型层的一个实体类。设计合理的数据库结构,可以有效存储和管理大量的旅游信息。 8. **安全...
JWT是一种轻量级的身份验证机制,可以在客户端和服务端之间传递安全信息,无需在每次请求时携带Session ID,减轻了服务器负担,提高了系统的可伸缩性。 五、数据库设计与ORM框架 在权限管理中,通常涉及用户、角色...
使用Spring Security或Apache Shiro等安全框架进行权限控制。 7. **测试与优化**:单元测试确保每个功能模块的正确性,性能测试找出系统瓶颈并进行优化。如调整数据库索引、缓存策略等。 综上所述,基于Java和...
在安全方面,Java论坛会使用Spring Security或Apache Shiro来实现用户认证和授权。这包括注册验证、密码加密存储、登录验证以及权限控制,确保只有合法用户能访问特定资源。 在并发处理上,Java论坛可能利用多线程...
Spring Security或Apache Shiro等框架可以用于实现用户认证和授权,保护系统资源不被非法访问。 7. **前端技术**:项目可能使用HTML、CSS和JavaScript构建用户界面,Bootstrap、Vue.js或React.js等前端框架可以提高...