您现在的位置是:主页 > news > 做网站要会哪些软件/站长之家网站介绍

做网站要会哪些软件/站长之家网站介绍

admin2025/4/26 12:53:50news

简介做网站要会哪些软件,站长之家网站介绍,龙岩网站制作,网络推广外包联系方式一、Shiro简介 1、Shiro是什么? Apache Shiro是一个fava的安全(权限)框架。 Shiro 可以非常容易的开发出足够好的应用,其不仅可以用在JavaSE环境,也可以用在JavaEE环境。Shiro可以完成,认证,授权,加密&…

做网站要会哪些软件,站长之家网站介绍,龙岩网站制作,网络推广外包联系方式一、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相关

1.创建项目:

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了