您现在的位置是:主页 > news > 做网站要会哪些软件/站长之家网站介绍
做网站要会哪些软件/站长之家网站介绍
admin2025/4/26 12:53:50【news】
简介做网站要会哪些软件,站长之家网站介绍,龙岩网站制作,网络推广外包联系方式一、Shiro简介 1、Shiro是什么? Apache Shiro是一个fava的安全(权限)框架。 Shiro 可以非常容易的开发出足够好的应用,其不仅可以用在JavaSE环境,也可以用在JavaEE环境。Shiro可以完成,认证,授权,加密&…
一、Shiro简介
1、Shiro是什么?
Apache Shiro是一个fava的安全(权限)框架。
Shiro 可以非常容易的开发出足够好的应用,其不仅可以用在JavaSE环境,也可以用在JavaEE环境。Shiro可以完成,认证,授权,加密,会话管理,Web集成,缓存等。
下载地址: http://shiro.apache.org/
2、Shiro有哪些功能?
Authentication:身份认证、登录,验证用户是不是拥有相应的身份;
Authorization:授权,即权限验证,验证某个已认证的用户是否拥有某个权限.即判断用户能否进行什么操作,如:验证某个用户是否拥有某个角色,或者细粒度的验证某个用户对某个资源是否具有某个权限!
Session Manager:会话管理,即用户登录后就是第一次会话,在没有退出之前,它的所有信息都在会话中;会话可以是普通的JavaSE环境,也可以是Web环境;
Cryptography:加密,保护数据的安全性,如密码加密存储到数据库中,而不是明文存储;Web Support: Web支持,可以非常容易的集成到Web环境;
Caching: 缓存,比如用户登录后,其用户信息,拥有的角色、权限不必每次去查,这样可以提高效率Concurrency: Shiro支持多线程应用的并发验证,即,如在一个线程中开启另一个线程,能把权限自动的传播过去
Testing:提供测试支持;
Run As:允许一个用户假装为另一个用户(如果他们允许)的身份进行访问;
Remember Me:记住我,这个是非常常见的功能,即一次登录后,下次再来的话不用登录了
3.Shiro外部架构:
从外部来看Shiro,即从应用程序角度来观察如何使用shiro完成工作:
subject:应用代码直接交互的对象是Subject,也就是说Shiro的对外API核心就是Subject,Subject代表了当前的用户,这个用户不一定是一个具体的人,与当前应用交互的任何东西都是Subject,如网络爬虫,机器人等,与Subject的所有交互都会委托给SecurityManager; Subject其实是一个门面,SecurityManageer才是实际的执行者
SecurityManager: 安全管理器,即所有与安全有关的操作都会与SercurityManager交互,并且它管理着所有的Subject,可以看出它是Shiro的核心,它负责与Shiro的其他组件进行交互,它相当于SpringMVC的DispatcherServlet的角色
Realm: Shiro从Realm获取安全数据〈如用户,角色,权限),就是说SecurityManager要验证用户身份,那么它需要从Realm 获取相应的用户进行比较,来确定用户的身份是否合法;也需要从Realm得到用户相应的角色、权限,进行验证用户的操作是否能够进行,可以把Realm看成DataSource
二、配置Shiro相关
2.导入依赖:
<dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring-boot-web-starter</artifactId><version>1.7.1</version></dependency>
3、创建realm对象,需要自定义类
注入到spring中,让spring托管:
//创建realm对象,需要自定义类: 第一步@Beanpublic UserRealm userRealm(){return new UserRealm();}
4、创键DafauLtwebSecurityManager
//DafauLtwebSecurityManager@Beanpublic DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();//关联UserRealmsecurityManager.setRealm(userRealm);return securityManager;}
5、创建shiroFilterFactoryBean
@Beanpublic ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("getDefaultWebSecurityManager") DefaultWebSecurityManager defaultWebSecurityManager){ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();//设置安全管理器factoryBean.setSecurityManager(defaultWebSecurityManager);return factoryBean;}
到这里核心基本就配置好了!
三、实现登录拦截
先随便写两个简单页面:
add内容:
update内容:
编写控制器请求:
在index页面写add和update实现跳转各自页面:
启动测试:现在点击add和update是能跳转的,接下来就要做拦截功能实现
在ShiroCinfig配置拦截:
add和update配置认证,需要认证才能访问:
//添加shiro的内置过滤器/*anno: 无需认证就可以访问authc: 必须认证了才可以访问user: 必须拥有 记住我 功能才能用perms: 拥有对某个资源的权限才能访问role: 拥有某个角色权限才能访问*/Map<String, String> filterMap = new LinkedHashMap<>();//拦截filterMap.put("/user/*","authc");
配置之后启动测试:然后点击add或者update
如果拦截成功会默认跳到登录页去,如果我们没有编写登录页就出现404:如下图
符合我们的要求证明拦截成功
接下来写个简单的登录页让他跳转:
<h1>登录</h1>
<form th:action="@{/login}"><p> 用户名:<input type="text" name="username"> </p><p> 密码:<input type="password" name="password"> </p><p> <input type="submit"> </p>
</form></body>
然后编写登录控制器实现跳转:
@RequestMapping("/toLogin")public String toLogin(){return "login";}
在ShiroConfig设置登录请求:
再次启动测试:
点击add或者update会跳到登录页:证明拦截成功
四、实现用户认证
1.获取要登陆的用户:
前端:
<h1>登录</h1>
<p th:text="${msg}" style="color: red"></p>
<form th:action="@{/login}"><p> 用户名:<input type="text" name="username"> </p><p> 密码:<input type="password" name="password"> </p><p> <input type="submit"> </p>
</form>
后端:
@RequestMapping("/login")public String login(@RequestParam("username") String name, @RequestParam("password") String password,Model model){//获取当前的用户Subject subject = SecurityUtils.getSubject();//封装用户的登录数据UsernamePasswordToken token = new UsernamePasswordToken(name, password);try {subject.login(token); // 执行登录方法,如果没有异常就说明OK了return "index";}catch (UnknownAccountException accountException){// 用户名不存在model.addAttribute("msg","用户名错误");return "login";}catch (IncorrectCredentialsException e){// 密码错误model.addAttribute("msg","密码错误");return "login";}}
启动项目测试:随便输入用户名密码提交
查看控制台,是执行了认证的
说明进入了这个方法:那么进入了这个方法我们就可以在里面做相关认证操作
在UserRealm配置认证操作:
//认证@overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException{System.out.print1n("执行了=>认证doGetAuthorizationInfo") ;//用户名,按道理密码数据中取,现在我们模拟用户名密码String name = "root";String password = "123456";UsernamePasswordToken userToken = (UsernamePasswordToken) token;if ( !userToken.getUsername().equals(name)) {return null;//抛出异常UnknownAccountException}// 密码认证, shiro做~return new SimpleAuthenticationInfo( principal: "" ,password,realmName:"");
}
启动测试:
先测试错误用户名密码:我们的是用户名root密码是123456
会显示用户名错误
在测试错误用户名密码:我们的是用户名root密码是123456
会显示密码错误
在然后输入正确的用户名密码:
登录成功进入首页:
也能进入update以及add页:
有了上面的操作,算是成功的实现了Shiro功能,现在我们就可以着Mybatis了
五、整合mybatis
1.导入相关依赖
<!--连接数据库驱动--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.20</version></dependency><!-- https://mvnrepository.com/artifact/log4j/log4j --><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency><!--德鲁伊数据源--><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.22</version></dependency><!--引入mybatis,这是Mybatis官方提供的适配SpringBoot的,而不是SpringBoot自己的--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.1</version></dependency>
2.配置mybatisYML:
2.配置德鲁伊连接池:
spring:datasource:# 使用阿里的Druid连接池type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driver# 填写你数据库的url、登录名、密码和数据库名url: jdbc:mysql://127.0.0.1:3306/mydb?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai#数据库用户名username: root#数据库密码password: rootdruid:# 连接池的配置信息# 初始化大小,最小,最大initial-size: 5min-idle: 5maxActive: 20# 配置获取连接等待超时的时间maxWait: 60000# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒timeBetweenEvictionRunsMillis: 60000# 配置一个连接在池中最小生存的时间,单位是毫秒minEvictableIdleTimeMillis: 300000validationQuery: SELECT 1testWhileIdle: truetestOnBorrow: falsetestOnReturn: false# 打开PSCache,并且指定每个连接上PSCache的大小poolPreparedStatements: truemaxPoolPreparedStatementPerConnectionSize: 20# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙filters: stat,wall,slf4j# 通过connectProperties属性来打开mergeSql功能;慢SQL记录connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000# 配置DruidStatFilterweb-stat-filter:enabled: trueurl-pattern: "/*"exclusions: "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*"# 配置DruidStatViewServletstat-view-servlet:url-pattern: "/druid/*"# IP白名单(没有配置或者为空,则允许所有访问)allow: 127.0.0.1,192.168.8.109# IP黑名单 (存在共同时,deny优先于allow)deny: 192.168.1.188# 禁用HTML页面上的“Reset All”功能reset-enable: false# 登录名login-username: admin# 登录密码login-password: 123456
3.编写实体类以及数据库:数据库很简单自行编写
4.编写mapper层以及mapper.xml
5.编写service层以及serviceimpl:
6.编写Shiro认证:
7.现在用的是真实数据库的数据:
//认证@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {System.out.println("执行了 => 认证AuthenticationToken");UsernamePasswordToken userToken = (UsernamePasswordToken) authenticationToken;//连接真实数据库User user = userService.queryUserByName(userToken.getUsername());if (user==null){return null;}//密码认证,Shiro来做return new SimpleAuthenticationInfo("",user.getPassword(),"");}
8.启动项目测试:
输入数据库的账号密码:提交
可以登录,已实现拦截功能
六、Shiro请求与授权操作
1.编写ShiroConfig:设置用户授权
filterMap.put("/user/add","perms[user:add]");
每次访问设置授权的页面,都会执行授权的这个方法
2.启动项目测试
3.点击update
4.是能进入update页面的,因为update没有授权
5.返回在带点击add页面:
6.大家看到报错401,401就是未授权的意思
7.正常情况下如果未授权就会跳到为授权的页面:我们快速编写一下
编写控制层:
@RequestMapping("/noauth")@ResponseBodypublic String unauthorized(){return "未经授权无法访问此页面!";}
8.在Shiro配置未授权跳转页面:
9.重写启动项目测试看看能不能跳转到未授权页面:
输入未授权的用户登录
然后点击add
成功跳转到未授权页面:这个页面无论你写多么好看东西,我只是偷懒用字符串代替了
10.接下来配置授权用户,这个时候还没有真正的把权限给用户,所有需要在UserRealm编写给用户授权:
启动项目测试:登录进来点击add
这个时候可以看到是能进add页面的
11.但是有个问题,所有用户都可以进,因为每个用户进入都被授权了,不符合我们的逻辑,这样编写就没意义,按照逻辑需要在数据库中配置一个字段,这个字段专门看用户的权限
添加字段:这个字段是每个用户的权限
12.修改了数据库之后,pojo也要修改
13.要拿到当前登录用户,才知道这个用户有是权限
然后登录测试就行O了