⑴ spring中如何配置shiro和quartz的问题
楼主我给你发下我配置的qurzte吧 <!– 要调用的工作类 –> <bean id="quartzJob" class="com.ush..AutoUpdate"> <property name="u" ref="ushDao"></property> </bean> <!– 定义调用对象和调用对象的方法 –> <bean id="jobtask" class="org.springframework.scheling.quartz."> <!– 调用的类 –> <property name="targetObject"> <ref bean="quartzJob" /> </property> <!– 调用类中的方法 –> <property name="targetMethod"> <value>AutoUpdateByTime</value> </property> </bean> <!– 定义触发时间 –> <bean id="doTime" class="org.springframework.scheling.quartz.CronTriggerBean"> <property name="jobDetail"> <ref bean="jobtask" /> </property> <!– cron表达式 –> <property name="cronExpression"> <value>0 0 */1 * * ?</value> </property> </bean> <!– 总管理类如果将lazy-init='false'那么容器启动就会执行调度程序 –> <bean id="startQuertz" lazy-init="false" class="org.springframework.scheling.quartz.SchelerFactoryBean"> <property name="triggers"> <list> <ref bean="doTime" /> </list> </property> </bean>
⑵ 怎么往spring shiro 配置默认账户
第一步:配置WEB.XMLshiroFilterorg.springframework.web.filter.DelegatingFilterProxytargetFilterLifecycletrueshiroFilter/*第二步:SHIRO整合SPRING配置applicationContext-shiro.xml 伪代码:<!–指定本系统SESSIONID, 默认为: JSESSIONID问题: 与SERVLET容器名冲突, 如JETTY, TOMCAT 等默认JSESSIONID,当跳出SHIRO SERVLET时如ERROR-PAGE容器会为JSESSIONID重新分配值导致登录会话丢失!–><!–定时清理僵尸session,Shiro会启用一个后台守护线程定时执行清理操作用户直接关闭浏览器造成的孤立会话–><bean id="sessionValidationScheler"class="org.apache.shiro.session.mgt.">…第三步:Zookeeper对Shiro-SessionDao实现类ZKShiroSessionDAO.java伪代码:import bgonline.foundation.hadoop.zk.IZookeeperTemplate;import bgonline.foundation.hadoop.zk.ZNode;import org.apache.shiro.cache.AbstractCacheManager;import org.apache.shiro.cache.Cache;import org.apache.shiro.cache.CacheException;import org.apache.shiro.cache.MapCache;import org.apache.shiro.session.Session;import org.apache.shiro.session.UnknownSessionException;import org.apache.shiro.session.mgt.eis.AbstractSessionDAO;import org.apache.shiro.session.mgt.eis.CachingSessionDAO;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.util.SerializationUtils;import java.io.Serializable;import java.util.Collection;import java.util.HashSet;import java.util.List;import java.util.Set;import java.util.concurrent.ConcurrentHashMap;/*** ZOOKEEPER实现SHIRO集群SESSION存储** @author aliencode* @date 13-7-10*/public class ZKShiroSessionDAO extends CachingSessionDAO {public ZKShiroSessionDAO() {}private boolean useMemCache = false;/*** SESSION ZK DAO 实例* 如果开户缓存* 用户登录时自动缓存, 用户登录超时自动删除* 由于shiro的cacheManager是全局的, 所以这里使用setActiveSessionsCache直接设置Cache来本地缓存, 而不使用全局zk缓存.* 由于同一用户可能会被路由到不同服务器,所以在doReadSession方法里也做了缓存增加.** @param useMemCache 是否使用内存缓存登录信息*/public ZKShiroSessionDAO(boolean useMemCache) {this.useMemCache = useMemCache;if (useMemCache) {setActiveSessionsCache(new MapCache>(this.ACTIVE_SESSION_CACHE_NAME, new ConcurrentHashMap()));}}Logger logger = LoggerFactory.getLogger(this.getClass());/*** ZK操作类*/private IZookeeperTemplate zookeeperTemplate;/*** 缓存根路径, 结尾不加/*/private String shiroSessionZKPath = "/SHIROSESSIONS";/*** 缓存项前缀*/private String sessionPrefix = "session-";/*** 设置Shiro Session 前缀 默认 session-** @param sessionPrefix*/public void setSessionPrefix(String sessionPrefix) {this.sessionPrefix = sessionPrefix;}public void setZookeeperTemplate(IZookeeperTemplate zookeeperTemplate) {this.zookeeperTemplate = zookeeperTemplate;}/*** 设置Shiro在ZK服务器存放根路径** @param shiroSessionZKPath 默认值:/SHIROSESSIONS/*/public void setShiroSessionZKPath(String shiroSessionZKPath) {this.shiroSessionZKPath = shiroSessionZKPath;}/*** session更新** @param session* @throws UnknownSessionException*/@Overridepublic void update(Session session) throws UnknownSessionException {if (session == null || session.getId() == null) {logger.error("session argument cannot be null.");}saveSession(session, "update");}@Overrideprotected void doUpdate(Session session) {}/*** session删除** @param session*/@Overridepublic void delete(Session session) {if (session == null || session.getId() == null) {logger.error("session argument cannot be null.");}logger.debug("delete session for id: {}", session.getId());zookeeperTemplate.deleteNode(getPath(session.getId()));if (useMemCache) {this.uncache(session);}}@Overrideprotected void doDelete(Session session) {}/*** 获取当前活跃的session, 当前在线数量** @return*/@Overridepublic Collection getActiveSessions() {ZNode zNode = new ZNode();zNode.setPath(shiroSessionZKPath);Set sessions = new HashSet();//读取所有SessionID , 返回形如: session-9e3b5707-fa80-4d32-a6c9-f1c3685263a5List ss = zookeeperTemplate.getChildren(zNode);for (String id : ss) {if (id.startsWith(sessionPrefix)) {String noPrefixId = id.replace(sessionPrefix, "");Session session = doReadSession(noPrefixId);if (session != null) sessions.add(session);}}logger.debug("shiro getActiveSessions. size: {}", sessions.size());return sessions;}/*** 创建session, 用户登录** @param session* @return*/@Overrideprotected Serializable doCreate(Session session) {Serializable sessionId = this.generateSessionId(session);this.assignSessionId(session, sessionId);saveSession(session, "create");return sessionId;}/*** session读取** @param id* @return*/@Overrideprotected Session doReadSession(Serializable id) {if (id == null) {logger.error("id is null!");return null;}logger.debug("doReadSession for path: {}", getPath(id));Session session;byte[] byteData = zookeeperTemplate.getData(getPath(id)).getByteData();if (byteData != null && byteData.length > 0) {session = (Session) SerializationUtils.deserialize(byteData);if (useMemCache) {this.cache(session, id);logger.debug("doReadSession for path: {}, add cached !", getPath(id));}return session;} else {return null;}}/*** 生成全路径** @param sessID* @return*/private String getPath(Serializable sessID) {return shiroSessionZKPath + '/' + sessionPrefix + sessID.toString();}/*** session读取或更新** @param session* @param act update/save*/private void saveSession(Session session, String act) {Serializable sessionId = session.getId();ZNode sessionNode = new ZNode();sessionNode.setByteData(SerializationUtils.serialize(session));sessionNode.setPath(getPath(sessionId));logger.debug("save session for id: {}, act: {}", sessionId, act);if (act == "update")zookeeperTemplate.setData(sessionNode);elsezookeeperTemplate.createNode(sessionNode);}}
⑶ ssm框架访问控制应该怎么做
这个就在在人员表了添加一个身份的字段 user_rank ,用这个来控制。用户登录到时候就会用登录信息,把这个 user_rank 字段带出来,在页面或者链接时候加上判断,哈这是简单的,看下官方的。
shiro安全框架是目前为止作为登录注册最常用的框架,因为它十分的强大简单,提供了认证、授权、加密和会话管理等功能 。
shiro能做什么?
认证:验证用户的身份
授权:对用户执行访问控制:判断用户是否被允许做某事
会话管理:在任何环境下使用 Session API,即使没有 Web 或EJB 容器。
加密:以更简洁易用的方式使用加密功能,保护或隐藏数据防止被偷窥
Realms:聚集一个或多个用户安全数据的数据源
单点登录(SSO)功能。
为没有关联到登录的用户启用 "Remember Me“ 服务
Shiro 的四大核心部分
Authentication(身份验证):简称为“登录”,即证明用户是谁。
Authorization(授权):访问控制的过程,即决定是否有权限去访问受保护的资源。
Session Management(会话管理):管理用户特定的会话,即使在非 Web 或 EJB 应用程序。
Cryptography(加密):通过使用加密算法保持数据安全
shiro的三个核心组件:
Subject:正与系统进行交互的人,或某一个第三方服务。所有 Subject 实例都被绑定到(且这是必须的)一个SecurityManager 上。
SecurityManager:Shiro 架构的心脏,用来协调内部各安全组件,管理内部组件实例,并通过它来提供安全管理的各种服务。当 Shiro 与一个 Subject 进行交互时,实质上是幕后的 SecurityManager 处理所有繁重的 Subject 安全操作。
Realms:本质上是一个特定安全的 DAO。当配置 Shiro 时,必须指定至少一个 Realm 用来进行身份验证和/或授权。Shiro 提供了多种可用的 Realms 来获取安全相关的数据。如关系数据库(JDBC),INI 及属性文件等。可以定义自己 Realm 实现来代表自定义的数据源。
shiro整合SSM框架:
1.加入 jar 包:以下jar包自行网络下载
准备好了,接下来要写Realm方法了,新建shiro包,在包下新建MyRealm.java文件继承AuthorizingRealm
package shiro;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.credential.HashedCredentialsMatcher;import org.apache.shiro.authz.AuthorizationInfo;import org.apache.shiro.authz.SimpleAuthorizationInfo;import org.apache.shiro.crypto.hash.Md5Hash;import org.apache.shiro.crypto.hash.SimpleHash;import org.apache.shiro.realm.AuthorizingRealm;import org.apache.shiro.subject.PrincipalCollection;import org.apache.shiro.util.ByteSource;import org.springframework.beans.factory.annotation.Autowired;import bean.user;import .user;public class MyRealm extends AuthorizingRealm {@Autowired private user user;String pass; /*** 授权:**/@Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();Object principal = principalCollection.getPrimaryPrincipal();//获取登录的用户名if("admin".equals(principal)){ //两个if根据判断赋予登录用户权限info.addRole("admin");} if("user".equals(principal)){info.addRole("list");}info.addRole("user");return info;} /** 用户验证**/@Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {//1. token 中获取登录的 username! 注意不需要获取password.Object principal = token.getPrincipal();//2. 利用 username 查询数据库得到用户的信息.user user=user.findbyname((String) principal); if(user!=null){pass=user.getPass();}String credentials = pass; //3.设置盐值 ,(加密的调料,让加密出来的东西更具安全性,一般是通过数据库查询出来的。 简单的说,就是把密码根据特定的东西而进行动态加密,如果别人不知道你的盐值,就解不出你的密码)String source = "abcdefg";ByteSource credentialsSalt = new Md5Hash(source);//当前 Realm 的nameString realmName = getName(); //返回值实例化SimpleAuthenticationInfo info =new SimpleAuthenticationInfo(principal, credentials,credentialsSalt, realmName);return info;} //init-method 配置.public void setCredentialMatcher(){HashedCredentialsMatcher credentialsMatcher = new HashedCredentialsMatcher();credentialsMatcher.setHashAlgorithmName("MD5");//MD5算法加密credentialsMatcher.setHashIterations(1024);//1024次循环加密setCredentialsMatcher(credentialsMatcher);}//用来测试的算出密码password盐值加密后的结果,下面方法用于新增用户添加到数据库操作的,我这里就直接用main获得,直接数据库添加了,省时间public static void main(String[] args) {String saltSource = "abcdef";String hashAlgorithmName = "MD5";String credentials = "passwor";Object salt = new Md5Hash(saltSource); int hashIterations = 1024;Object result = new SimpleHash(hashAlgorithmName, credentials, salt, hashIterations);System.out.println(result);}}
好了,接下来我们写一个简单的action来通过shiro登录验证。
//登录认证 @RequestMapping("/shiro-login") public String login(@RequestParam("username") String username, @RequestParam("password") String password){ Subject subject = SecurityUtils.getSubject(); UsernamePasswordToken token = new UsernamePasswordToken(username, password); try { //执行认证操作. subject.login(token); }catch (AuthenticationException ae) { System.out.println("登陆失败: " + ae.getMessage()); return "/index"; } return "/shiro-success"; }
//温馨提示:记得在注册中密码存入数据库前也记得加密哦,提供一个utils方法//进行shiro加密,返回加密后的结果public static String md5(String pass){String saltSource = "blog"; String hashAlgorithmName = "MD5";Object salt = new Md5Hash(saltSource);int hashIterations = 1024; Object result = new SimpleHash(hashAlgorithmName, pass, salt, hashIterations);String password = result.toString();return password;}
好了,shiro登录验证到这里完了
⑷ springMvc+shiro做权限管理,页面上的静态资源,样式图片等没有出现,用几种方式过滤试过,还是不行
正常情况是不会出现这样的,shiro对于静态资源的处理,不用特殊配置。
只需要在shiroFilter过滤器filterChainDefinitions项中增加一个静态资源处理规则就可以,例如允许/css/开头的资源匿名访问,只需要这样一句配置就足矣。
/css/** = anon
配置完成后,未登录就可以在浏览器中直接访问css下的资源,新项目用的shiro,简单而又实用的权限框架。